Hello,
I've been running into a problem when trying to validate the pop-ups from a grid edit.
When I have everything set up as in the code below, errors from the controller are returned as a string on a new page, rather than to the ValidationSummary or ValidationMessage Tags.
Here is the PartialView used as a template for the Pop-up editor
@model CopyOrder
<
script
src
=
"~/Scripts/jquery.validate.unobtrusive.js"
></
script
>
<
script
src
=
"~/Scripts/jquery.validate.unobtrusive.min.js"
></
script
>
<
div
class
=
"EditorContainer"
>
<
div
id
=
"OrderEditorSubHeader"
>Order <
b
>Information</
b
></
div
>
@using (Html.BeginForm("OrderCopy", "OrderManagement")){
<
div
class
=
"form-group"
>
@Html.Label("Copy Order ID")
@(Html.Kendo().ComboBoxFor(m=>m.CopyOrderID)
//.Name("CopyOrderID")
.Filter("contains")
.Placeholder("Please Select")
.DataSource(dataSource => dataSource.Read(read => read.Url("/OrderManagement/OrderID_Select")))
.DataTextField("Text")
.DataValueField("Value")
.Suggest(true)
.HtmlAttributes(new { @class = "form-control" }))
@Html.ValidationMessageFor(m => m.CopyOrderID)
</
div
>
<
div
class
=
"form-group"
>
@Html.Label("Copy To Customer")
@(Html.Kendo().ComboBoxFor(m=>m.CopyCustomerID)
//.Name("CopyCustomerID")
.Filter("contains")
.Placeholder("Please Select")
.DataSource(dataSource =>
dataSource.Read(read =>
{
read.Action("AvailableCustomers_Select", "OrderManagement")
.Data("filterAvailableCustomers");
})
.ServerFiltering(true)
)
.DataTextField("Text")
.DataValueField("Value")
.Suggest(true)
.Enable(false)
.AutoBind(false)
.ValuePrimitive(true)
.CascadeFrom("CopyOrderID")
.HtmlAttributes(new { @class = "form-control" }))
@Html.ValidationMessageFor(m => m.CopyCustomerID)
</
div
>
<
input
id
=
"submitbtn"
type
=
"submit"
value
=
"Save"
/>
@Html.ValidationSummary(false)
}
Here is the Controller code
[HttpPost]
public
ActionResult OrderCopy([DataSourceRequest] DataSourceRequest request, Ops.Models.CopyOrder Copy)
{
var db =
new
Ops.Models.Ops_Entities();
if
(ModelState.IsValid)
{
try
{
//A bunch of Linq Queries here
//One of them causes a NullReference Exception
db.OrderGroups.Add(newGroup);
db.SaveChanges();
return
RedirectToAction(
"Orders"
);
}
catch
(NullReferenceException)
{
//Code reaches this point when I trigger the error in question
//Problem is that when it is returned, a new page is opened just displaying the error message as a string
ModelState.AddModelError(String.Empty,
"Invalid Selection"
);
var failmodel2 = (
new
List<Ops.Models.CopyOrder> { Copy }).ToList().ToDataSourceResult(request, ModelState);
return
Json(failmodel2, JsonRequestBehavior.AllowGet);
}
}
var failmodel =
new
List<Ops.Models.CopyOrder>();
return
Json(failmodel.ToDataSourceResult(request, ModelState));
}
and my kendo grid
@(Html.Kendo().Grid<
Ops.Models.vw_Orders
>()
.Name("Orders")
.EnableCustomBinding(true)
.Columns(columns =>
{
columns.Bound(p => p.SchoolYear)
.Title("Year");
columns.Bound(p => p.Company)
.Title("School Name")
.ClientTemplate("<
span
><
a
href
=
'/CustomerManagement/SchoolInfo?CustomerID=#=CustomerID#'
>#=Company#</
a
></
span
>");
columns.Bound(p => p.MasterOrderID)
.Title("Order ID");
columns.Bound(p => p.GroupName);
columns.Bound(p => p.Type);
columns.Bound(p => p.Program);
columns.Bound(p => p.Status)
.ClientTemplate("<
span
>#=Status#</
span
>");
columns.Bound(p => p.AddUser);
columns.Bound(p => p.SalesTerritory)
.Title("Territory");
})
.Editable(editable => editable.Mode(GridEditMode.PopUp).TemplateName("OrderGroupEdit"))
.ToolBar(toolBar =>
{
toolBar.Create().Text("Add Order");
toolBar.Custom().Text("Copy Order").HtmlAttributes(new { id = "openCopyWindow" });
toolBar.Custom().Text("Add Service Item").HtmlAttributes(new { id = "openServiceItemWindow" });
toolBar.Custom().Text("Get Job Master").HtmlAttributes(new { id = "openJobMastWindow" });
})
.Pageable(o =>
{
o.PageSizes(new[] { 11, 20, 50, 100, 1000 });
o.ButtonCount(4);
})
.Sortable()
.Filterable(f =>
f.Operators(o =>
o.ForString(d => d
.Clear()
.Contains("Contains")
.IsEqualTo("Equal To")
)
)
)
.Events(e => e.DataBound("onDataBound"))
.ClientDetailTemplateId("OrderDetails")
.DataSource(dataSource => dataSource
.Ajax()
.Model(model => model.Id(m => m.MasterOrderID))
.PageSize(100)
.Read(read => read.Action("OrderSearch", "OrderManagement"))
.Create(create => create.Action("OrderCreate", "OrderManagement"))
.ServerOperation(true)
)
)
@(Html.Kendo().Window()
.Name("window")
.Title("Copy Order")
.Content("")
.LoadContentFrom("CopyOrder", "OrderManagement")
.Draggable()
.Visible(false)
.Width(800)
//.Events(e => e.Close("ManualWindow_close"))
)
and the js opening the window
$(document).ready(
function
() {
$(
"#openCopyWindow"
).click(
function
(e) {
e.preventDefault();
var
window = $(
"#window"
).data(
"kendoWindow"
);
window.center().open();
});
})