Kendo UI MVVM
نویسنده: وحید نصیری
تاریخ: ۱۳۹۳/۰۸/۲۴ ۱۵:۵۵
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
namespace KendoUI07.Models
{
public class Registration
{
public int Id { set; get; }
public string UserName { set; get; }
public string CourseName { set; get; }
public int Credit { set; get; }
public string Email { set; get; }
public string Tel { set; get; }
}
} <script type="text/javascript">
$(function () {
var model = kendo.data.Model.define({
id: "Id",
fields: {
Id: { type: 'number' }, // leave this set to 0 or undefined, so Kendo knows it is new.
UserName: { type: 'string' },
CourseName: { type: 'string' },
Credit: { type: 'number' },
Email: { type: 'string' },
Tel: { type: 'string' }
}
});
});
</script> <script type="text/javascript">
$(function () {
var viewModel = kendo.observable({
accepted: false,
course: new model()
});
});
</script> <div id="coursesSection" class="k-rtl k-header">
<div class="box-col">
<form id="myForm" data-role="validator" novalidate="novalidate">
<h3>ثبت نام</h3>
<ul>
<li>
<label for="Id">Id</label>
<span id="Id" data-bind="text:course.Id"></span>
</li>
<li>
<label for="UserName">نام</label>
<input type="text" id="UserName" name="UserName" class="k-textbox"
data-bind="value:course.UserName"
required />
</li>
<li>
<label for="CourseName">دوره</label>
<input type="text" dir="ltr" id="CourseName" name="CourseName" required
data-bind="value:course.CourseName" />
<span class="k-invalid-msg" data-for="CourseName"></span>
</li>
<li>
<label for="Credit">مبلغ پرداختی</label>
<input id="Credit" name="Credit" type="number" min="1000" max="6000"
required data-max-msg="عددی بین 1000 و 6000" dir="ltr"
data-bind="value:course.Credit"
class="k-textbox k-input" />
<span class="k-invalid-msg" data-for="Credit"></span>
</li>
<li>
<label for="Email">پست الکترونیک</label>
<input type="email" id="Email" dir="ltr" name="Email"
data-bind="value:course.Email"
required class="k-textbox" />
</li>
<li>
<label for="Tel">تلفن</label>
<input type="tel" id="Tel" name="Tel" dir="ltr" pattern="\d{8}"
required class="k-textbox"
data-bind="value:course.Tel"
data-pattern-msg="8 رقم" />
</li>
<li>
<input type="checkbox" name="Accept"
data-bind="checked:accepted"
required />
شرایط دوره را قبول دارم.
<span class="k-invalid-msg" data-for="Accept"></span>
</li>
<li>
<button class="k-button"
data-bind="enabled: accepted, click: doSave"
type="submit">
ارسال
</button>
<button class="k-button" data-bind="click: resetModel">از نو</button>
</li>
</ul>
<span id="doneMsg"></span>
</form>
</div> <script type="text/javascript">
$(function () {
var model = kendo.data.Model.define({
// ...
});
var viewModel = kendo.observable({
// ...
});
kendo.bind($("#coursesSection"), viewModel);
});
</script> <input type="text" id="UserName" name="UserName" class="k-textbox"
data-bind="value:course.UserName"
required /> <input type="checkbox" name="Accept"
data-bind="checked:accepted"
required />
<button class="k-button"
data-bind="enabled: accepted, click: doSave"
type="submit">
ارسال
</button> <script type="text/javascript">
$(function () {
var model = kendo.data.Model.define({
//...
});
var dataSource = new kendo.data.DataSource({
type: 'json',
transport: {
read: {
url: "api/registrations",
dataType: "json",
contentType: 'application/json; charset=utf-8',
type: 'GET'
},
create: {
url: "api/registrations",
contentType: 'application/json; charset=utf-8',
type: "POST"
},
update: {
url: function (course) {
return "api/registrations/" + course.Id;
},
contentType: 'application/json; charset=utf-8',
type: "PUT"
},
destroy: {
url: function (course) {
return "api/registrations/" + course.Id;
},
contentType: 'application/json; charset=utf-8',
type: "DELETE"
},
parameterMap: function (data, type) {
// Convert to a JSON string. Without this step your content will be form encoded.
return JSON.stringify(data);
}
},
schema: {
model: model
},
error: function (e) {
alert(e.errorThrown);
},
change: function (e) {
// فراخوانی در زمان دریافت اطلاعات از سرور و یا تغییرات محلی
viewModel.set("coursesDataSourceRows", new kendo.data.ObservableArray(this.view()));
}
});
var viewModel = kendo.observable({
//...
});
kendo.bind($("#coursesSection"), viewModel);
dataSource.read(); // دریافت لیست موجود از سرور در آغاز کار
});
</script> <script type="text/javascript">
$(function () {
$("#coursesSection").kendoValidator({
// ...
});
var model = kendo.data.Model.define({
// ...
});
var dataSource = new kendo.data.DataSource({
// ...
});
var viewModel = kendo.observable({
accepted: false,
course: new model(),
doSave: function (e) {
e.preventDefault();
console.log("this", this.course);
var validator = $("#coursesSection").data("kendoValidator");
if (validator.validate()) {
if (this.course.Id == 0) {
dataSource.add(this.course);
}
dataSource.sync(); // push to the server
this.set("course", new model()); // reset controls
}
},
resetModel: function (e) {
e.preventDefault();
this.set("course", new model());
}
});
kendo.bind($("#coursesSection"), viewModel);
dataSource.read(); // دریافت لیست موجود از سرور در آغاز کار
});
</script> <button class="k-button"
data-bind="enabled: accepted, click: doSave"
type="submit">
ارسال
</button>
<button class="k-button" data-bind="click: resetModel">از نو</button> using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using KendoUI07.Models;
namespace KendoUI07.Controllers
{
public class RegistrationsController : ApiController
{
public HttpResponseMessage Delete(int id)
{
var item = RegistrationsDataSource.LatestRegistrations.FirstOrDefault(x => x.Id == id);
if (item == null)
return Request.CreateResponse(HttpStatusCode.NotFound);
RegistrationsDataSource.LatestRegistrations.Remove(item);
return Request.CreateResponse(HttpStatusCode.OK, item);
}
public IEnumerable<Registration> Get()
{
return RegistrationsDataSource.LatestRegistrations;
}
public HttpResponseMessage Post(Registration registration)
{
if (!ModelState.IsValid)
return Request.CreateResponse(HttpStatusCode.BadRequest);
var id = 1;
var lastItem = RegistrationsDataSource.LatestRegistrations.LastOrDefault();
if (lastItem != null)
{
id = lastItem.Id + 1;
}
registration.Id = id;
RegistrationsDataSource.LatestRegistrations.Add(registration);
// ارسال آی دی مهم است تا از ارسال رکوردهای تکراری جلوگیری شود
return Request.CreateResponse(HttpStatusCode.Created, registration);
}
[HttpPut] // Add it to fix this error: The requested resource does not support http method 'PUT'
public HttpResponseMessage Update(int id, Registration registration)
{
var item = RegistrationsDataSource.LatestRegistrations
.Select(
(prod, index) =>
new
{
Item = prod,
Index = index
})
.FirstOrDefault(x => x.Item.Id == id);
if (item == null)
return Request.CreateResponse(HttpStatusCode.NotFound);
if (!ModelState.IsValid || id != registration.Id)
return Request.CreateResponse(HttpStatusCode.BadRequest);
RegistrationsDataSource.LatestRegistrations[item.Index] = registration;
return Request.CreateResponse(HttpStatusCode.OK);
}
}
} <div id="coursesSection" class="k-rtl k-header">
<div class="box-col">
<form id="myForm" data-role="validator" novalidate="novalidate">
<!--فرم بحث شده در ابتدای مطلب-->
</form>
</div>
<div id="results">
<table class="metrotable">
<thead>
<tr>
<th>Id</th>
<th>نام</th>
<th>دوره</th>
<th>هزینه</th>
<th>ایمیل</th>
<th>تلفن</th>
<th></th>
<th></th>
</tr>
</thead>
<tbody data-template="row-template" data-bind="source: coursesDataSourceRows"></tbody>
<tfoot data-template="footer-template" data-bind="source: this"></tfoot>
</table>
<script id="row-template" type="text/x-kendo-template">
<tr>
<td data-bind="text: Id"></td>
<td data-bind="text: UserName"></td>
<td dir="ltr" data-bind="text: CourseName"></td>
<td>
#: kendo.toString(get("Credit"), "c0") #
</td>
<td data-bind="text: Email"></td>
<td data-bind="text: Tel"></td>
<td><button class="k-button" data-bind="click: deleteCourse">حذف</button></td>
<td><button class="k-button" data-bind="click: editCourse">ویرایش</button></td>
</tr>
</script>
<script id="footer-template" type="text/x-kendo-template">
<tr>
<td colspan="3"></td>
<td>
جمع کل: #: kendo.toString(totalPrice(), "c0") #
</td>
<td colspan="2"></td>
<td></td>
<td></td>
</tr>
</script>
</div>
</div> <script type="text/javascript">
$(function () {
// ...
var viewModel = kendo.observable({
accepted: false,
course: new model(),
coursesDataSourceRows: new kendo.data.ObservableArray([]),
doSave: function (e) {
// ...
},
resetModel: function (e) {
// ...
},
totalPrice: function () {
var sum = 0;
$.each(this.get("coursesDataSourceRows"), function (index, item) {
sum += item.Credit;
});
return sum;
},
deleteCourse: function (e) {
// the current data item is passed as the "data" field of the event argument
var course = e.data;
dataSource.remove(course);
dataSource.sync(); // push to the server
},
editCourse: function(e) {
// the current data item is passed as the "data" field of the event argument
var course = e.data;
this.set("course", course);
}
});
kendo.bind($("#coursesSection"), viewModel);
dataSource.read(); // دریافت لیست موجود از سرور در آغاز کار
});
</script> <script type="text/javascript">
$(function () {
var dataSource = new kendo.data.DataSource({
//...
change: function (e) {
// فراخوانی در زمان دریافت اطلاعات از سرور و یا تغییرات محلی
viewModel.set("coursesDataSourceRows", new kendo.data.ObservableArray(this.view()));
}
});
});
</script> var dsReviewList = new kendo.data.DataSource({
// ....
change: function (e) {
// change event is wired to success of the request.
// `e.action` with possible values: "itemchange", "add", "remove" and "sync".
},
error: function (xhr, error) {
// error event will be triggered if any error occurred for the request.
console.debug(xhr);
console.debug(error);
},
requestEnd: function(e) {
// Fired when a remote service request is finished.
var response = e.response;
var type = e.type;
console.log(type);
if (type == "undefined") {
showError();
}
else {
showSuccess(type);
}
}
});