This question is locked. New answers and comments are not allowed.
I've been scouring the forum for any answer to my problem, but so far, I have been unsuccessful.
Prereqs:
I have a view (Good, this is after all, Model-View-Controller design pattern :)
The View's model is a Master-detail datamodel representing only one object. The object has a List<object>.
In the view I have represented the Model's scalar properties using standard Html-helpers.
I also have a grid to represent the Model's List<object>-data.
This grid has been defined with 2 datakeys (id and linenumber)
The Grid have a ToolBar.Insert() function defined.
Each row in the grid have the traditional Edit/Delete commands.
The view renders fine and the grid is spot on.
My problems (or rather inconvenience):
Prereqs:
I have a view (Good, this is after all, Model-View-Controller design pattern :)
The View's model is a Master-detail datamodel representing only one object. The object has a List<object>.
In the view I have represented the Model's scalar properties using standard Html-helpers.
I also have a grid to represent the Model's List<object>-data.
This grid has been defined with 2 datakeys (id and linenumber)
The Grid have a ToolBar.Insert() function defined.
Each row in the grid have the traditional Edit/Delete commands.
The view renders fine and the grid is spot on.
My problems (or rather inconvenience):
- After inserting, the Grid stays in insert-mode, but the new row have been inserted correctly and shows up at the bottom of the list.
- After editing, the Grid stays in Edit-mode, but the edited row have been submitted to backend DB
- The "Cancel Edit" button removes the Model-id from the Url ("/ShowInvoice/123" becomes "/ShowInvoice"), unless a routekey have been defined, thus failing when trying to Exit mode.
So, by now, I am guessing, that you would like some more details regarding the Controller and the Views...
OK, this is the View:
@model Models.InvoiceHeader
@{
ViewBag.Title = "Invoice Details";
var inv_id = Model.InvoiceId;
}
@helper DetailViewTemplate(WebViewPage page, Models.InvoiceHeader invoice)
{
}
<
h2
>Invoice @Html.DisplayFor(m=>m.InvoiceId), @Html.DisplayFor(m=>m.Date)</
h2
>
<
div
style
=
"border: 1px solid #666; padding-top: 10px;"
>
<
div
style
=
"width: 700px !important; float: left;"
>
<
fieldset
>
<
legend
>@Html.DisplayFor(m=>m.Name),
@Html.DisplayFor(m=>m.InvoiceEventParticipant.FirstName) @Html.DisplayFor(m=>m.InvoiceEventParticipant.LastName)</
legend
>
<
div
class
=
"display-field"
>
@Html.DisplayFor(m=>m.CustomerId)
</
div
>
<
div
class
=
"display-field"
>
@Html.DisplayFor(m=>m.Name)
</
div
>
<
div
class
=
"display-field"
>
@Html.DisplayFor(m=>m.Adress)
</
div
>
<
div
class
=
"display-field"
>
@Html.DisplayFor(m=>m.Adress2)
</
div
>
<
div
class
=
"display-field"
>
@Html.DisplayFor(m=>m.Zip) @Html.DisplayFor(m=>m.City)
</
div
>
<
div
class
=
"display-field"
>
<
strong
>Attention: @Html.DisplayFor(m=>m.ContactName)</
strong
>
</
div
>
</
fieldset
>
</
div
>
<
div
style
=
"width: 200px; float: left;"
>
<
fieldset
>
<
legend
>Invoice status</
legend
>
<
div
class
=
"display-field"
>
<
span
>Closed : @Html.DisplayFor(m=>m.Closed) </
span
>
</
div
>
<
div
>
<
span
>Closed date : @Html.DisplayFor(m=>m.ClosedDate) </
span
>
</
div
>
<
div
>
<
span
>Closed by : @Html.DisplayFor(m=>m.ClosedReference) </
span
>
</
div
>
</
fieldset
>
</
div
>
<
div
style
=
"clear: both;"
/>
</
div
>
<
fieldset
>
<
legend
>Lines</
legend
>
@(Html.Telerik().Grid(Model.InvoiceLines)
.Editable(edit => edit.Enabled(false))
.PrefixUrlParameters(false)
.Name("GridLines")
.DataKeys(keys =>
{
keys.Add(m => m.InvoiceId).RouteKey("invoiceid");
keys.Add(m => m.Linenumber).RouteKey("linenumber");
})
.ToolBar(tools => { if (!Model.Closed) tools.Insert().ButtonType(GridButtonType.Image); })
.DataBinding(bind => bind.Server()
.Select("GetInvoiceline", "Invoice")
.Update("EditInvoiceLine", "Invoice")
.Insert("AddInvoiceLine", "invoice")
.Delete("DeleteInvoiceLine", "Invoice")
)
.Columns(col =>
{
col.Bound(i => i.Linenumber).Width(50).Title("#LNo").ReadOnly().Hidden();
col.Bound(i => i.InvoiceId).Width(50).Title("#INo").ReadOnly().Hidden();
col.Bound(i => i.Date).Width(190);
col.Bound(i => i.Description).Width(250);
col.Bound(i => i.Price).Width(150).Format("{0:N}").HtmlAttributes(new { style = "text-align:right" });
col.Command(cmd =>
{
cmd.Edit().ButtonType(GridButtonType.Image);
cmd.Delete().ButtonType(GridButtonType.Image);
}).Width(90).Visible(!Model.Closed);
})
.Sortable(sort =>
{
sort.OrderBy(order => order.Add(o => o.Linenumber));
sort.SortMode(GridSortMode.SingleColumn);
})
.RowAction(row =>
{
{
row.InEditMode = false;
row.InInsertMode = false;
}
})
)
<
p
>
@if (!Model.Closed)
{
@Html.ActionLink("Create Creditnote", "CreateCreditNote", "Invoice", new { id = Model.InvoiceId }, new { @class = "button" })
}
@Html.ActionLink("Back", "AllInvoices", "Invoice",null , new { @class = "button" })
</
p
>
</
fieldset
>
And this is the Controller (Selected actions only)
public
ActionResult GetInvoiceLine(
int
id)
{
return
View(
"ShowInvoice"
, db.InvoiceHeaders.Find(id));
}
public
ActionResult AddInvoiceLine(
int
id)
{
InvoiceHeader header = db.InvoiceHeaders.Find(id);
InvoiceLine line =
new
InvoiceLine() { InvoiceId = id };
if
(TryUpdateModel(line))
{
line.Linenumber = header.InvoiceLines.Max(x => x.Linenumber) + 10;
header.InvoiceLines.Add(line);
db.SaveChanges();
ModelState.Clear();
}
return
View(
"ShowInvoice"
, header);
}
public
ActionResult DeleteInvoiceLine(
int
id,
int
linenumber)
{
InvoiceLine line = db.InvoiceLines.Find(id, linenumber);
db.InvoiceLines.Remove(line);
db.SaveChanges();
return
View(
"ShowInvoice"
, db.InvoiceHeaders.Find(id));
}
[HttpPost]
public
ActionResult EditInvoiceLine(
int
id,
int
linenumber)
{
InvoiceLine line =
new
InvoiceLine();
if
(TryUpdateModel(line))
{
db.Entry(line).State = System.Data.EntityState.Modified;
db.SaveChanges();
}
return
View(
"ShowInvoice"
, db.InvoiceHeaders.Find(id));
}
So, now my Question is - WHERE did I mess up?
BTW, I have tried the ModelState.Clear()-command in both the "Add" and "Edit"-actions of the controller.