C# 如何编辑相关对象';MVC4中的属性?
我在编辑相关对象的属性时遇到一些问题。代码如下: 型号:C# 如何编辑相关对象';MVC4中的属性?,c#,asp.net-mvc,asp.net-mvc-4,razor,restsharp,C#,Asp.net Mvc,Asp.net Mvc 4,Razor,Restsharp,我在编辑相关对象的属性时遇到一些问题。代码如下: 型号: @Html.HiddenFor(model => model.Header.Id, Model.Header != null ? Model.Header.Id : null) <div class="display-label"> @Html.DisplayNameFor(model => model.Header.ExtraCost) </div> <div class="displa
@Html.HiddenFor(model => model.Header.Id, Model.Header != null ? Model.Header.Id : null)
<div class="display-label">
@Html.DisplayNameFor(model => model.Header.ExtraCost)
</div>
<div class="display-field">
<input type="text" name="Header.ExtraCost" id="Header.ExtraCost" data-varname="header.extraCost" value="@(Model.Header.ExtraCost)" />
@Html.ValidationMessageFor(model => model.Header.ExtraCost)
</div>
<div class="display-label">
@Html.DisplayNameFor(model => model.Header.ExtraVat)
</div>
<div class="display-field">
<input type="text" name="Header.ExtraVat" id="Header.ExtraVat" data-varname="header.extraVat" value="@(Model.Header.ExtraVat)" />
@Html.ValidationMessageFor(model => model.Header.ExtraVat)
</div>
DocumentLine.cs
主要问题是,此代码不仅没有编辑相关的对象值,而且还将DocumentLine的Header.Id
值设置为null。
有什么建议吗?在我的答案的最后一段中,这个问题很可能出现,但这里有一些其他提示可以帮助您调试类似的问题 查看Google chrome中的“网络”选项卡,或者下载Firefox的Firebug,查看您实际发布到该方法的内容,在该方法上设置断点,并确保该方法的参数实际获得值 删除输入的名称和id中的“标题”。实际使用 @EditorFor(model=>model.ExtraCost) 相反您尚未发布编辑视图的GET方法,请将此断点设置为断点,并确保将实体传递给该视图 如果你能做到这一点,你只需要使用@Html.HiddenFor(model=>model.Id)
在您看来,Id将作为Id发布,放在您的控制器中,它称为Id,thsi不会绑定,因此我怀疑Id实际上从未通过ActionResult。我不得不修改默认的RestSharp put方法,强制它先更新文档标题,然后更新发票行
/// PUT api/<controller>/5
/// <summary>
/// Upserts a InvoiceLine object and its DocumentHeader to the underlying DataContext
/// </summary>
/// <param name="id">Id of the InvoiceLine object.</param>
/// <param name="value">The InvoiceLine object to upsert.</param>
/// <returns>An HttpResponseMessage with HttpStatusCode.Ok if everything worked correctly. An exception otherwise.</returns>
public override HttpResponseMessage Put(string id, [FromBody]InvoiceLine value)
{
//If creation date is in UTC format we must change it to local time
value.DateCreated = value.DateCreated.ToLocalTime();
//update the document header if there is any change
var header = Database.Set<DocumentHeader>()
.FirstOrDefault(x => x.Id == value.Header.Id);
if (header != null)
{
value.Header.DocumentLines = header.DocumentLines;
value.Header.DocumentNumber = header.DocumentNumber;
Database.Entry<DocumentHeader>(header)
.CurrentValues.SetValues(value.Header);
}
else
{
Database.Set<DocumentHeader>().Add(value.Header);
}
// If entity exists, set current values to atomic properties
// Otherwise, insert as new
var entity = Database.Set<InvoiceLine>()
.FirstOrDefault(x => x.Id == id);
if (entity != null)
{
Database.Entry<InvoiceLine>(entity)
.CurrentValues.SetValues(value);
FixNavigationProperties(ref entity, value);
}
else
{
FixNavigationProperties(ref value);
Database.Set<InvoiceLine>().Add(value);
}
if (value is ISynchronizable)
(value as ISynchronizable).LastUpdated = DateTime.UtcNow;
// Save changes and handle errors
SaveChanges();
return new HttpResponseMessage(HttpStatusCode.OK);
}
///PUT api//5
///
///向上将InvoiceLine对象及其DocumentHeader插入基础DataContext
///
///InvoiceLine对象的Id。
///要向上插入的InvoiceLine对象。
///带有HttpStatusCode的HttpResponseMessage。如果一切正常,则为Ok。否则就是一个例外。
公共重写HttpResponseMessage Put(字符串id,[FromBody]发票行值)
{
//如果创建日期为UTC格式,我们必须将其更改为本地时间
value.DateCreated=value.DateCreated.ToLocalTime();
//如果有任何更改,请更新文档标题
var header=Database.Set()
.FirstOrDefault(x=>x.Id==value.Header.Id);
if(标题!=null)
{
value.Header.DocumentLines=Header.DocumentLines;
value.Header.DocumentNumber=Header.DocumentNumber;
Database.Entry(头)
.CurrentValues.SetValues(value.Header);
}
其他的
{
Database.Set().Add(value.Header);
}
//如果实体存在,请将当前值设置为原子属性
//否则,请作为新文件插入
var entity=Database.Set()
.FirstOrDefault(x=>x.Id==Id);
如果(实体!=null)
{
数据库条目(实体)
.CurrentValues.SetValues(值);
FixNavigationProperties(参考实体、值);
}
其他的
{
FixNavigationProperties(参考值);
Database.Set().Add(值);
}
如果(值是可同步的)
(值为IsSynchronizable)。LastUpdated=DateTime.UtcNow;
//保存更改并处理错误
保存更改();
返回新的HttpResponseMessage(HttpStatusCode.OK);
}
这对我有用。希望有帮助。我用Firebug检查了POST调用,它正在将参数正确地传递给ActionResult。我不能在没有“标题”的情况下使用EditorFor。因为这是一个从DocumentLine继承的InvoiceLine,并且它不包含对ExtraCost或ExtraVat的定义。>_您是否已将ActionResult中的参数id更改为id?谢谢您的回答,但是的,我已将其更改,但它不起作用。Post参数都正确,但仍在删除
Header.Id
属性。如果它没有与“id”绑定,我的其余代码将无法工作,因此这似乎不是问题所在。
@Html.HiddenFor(model => model.Header.Id, Model.Header != null ? Model.Header.Id : null)
<div class="display-label">
@Html.DisplayNameFor(model => model.Header.ExtraCost)
</div>
<div class="display-field">
<input type="text" name="Header.ExtraCost" id="Header.ExtraCost" data-varname="header.extraCost" value="@(Model.Header.ExtraCost)" />
@Html.ValidationMessageFor(model => model.Header.ExtraCost)
</div>
<div class="display-label">
@Html.DisplayNameFor(model => model.Header.ExtraVat)
</div>
<div class="display-field">
<input type="text" name="Header.ExtraVat" id="Header.ExtraVat" data-varname="header.extraVat" value="@(Model.Header.ExtraVat)" />
@Html.ValidationMessageFor(model => model.Header.ExtraVat)
</div>
/// <summary>
/// Handles the POST event for the Edit action, updating an existing TEntity object.
/// </summary>
/// <param name="id">Id of the TEntity object to update.</param>
/// <param name="model">TEntity object with properties updated.</param>
/// <returns>Redirection to the Index action if succeeded, the Edit View otherwise.</returns>
[HttpPost]
public virtual ActionResult Edit(string id, TEntity model)
{
var request = new RestSharp.RestRequest(Resource + "?id={id}", RestSharp.Method.PUT) { RequestFormat = RestSharp.DataFormat.Json }
.AddParameter("id", id, RestSharp.ParameterType.UrlSegment)
.AddBody(model);
var response = Client.Execute(request);
// Handle response errors
HandleResponseErrors(response);
if (Errors.Length == 0)
return RedirectToAction("Index");
else
{
ViewBag.Errors = Errors;
return View(model);
}
}
/// PUT api/<controller>/5
/// <summary>
/// Upserts a InvoiceLine object and its DocumentHeader to the underlying DataContext
/// </summary>
/// <param name="id">Id of the InvoiceLine object.</param>
/// <param name="value">The InvoiceLine object to upsert.</param>
/// <returns>An HttpResponseMessage with HttpStatusCode.Ok if everything worked correctly. An exception otherwise.</returns>
public override HttpResponseMessage Put(string id, [FromBody]InvoiceLine value)
{
//If creation date is in UTC format we must change it to local time
value.DateCreated = value.DateCreated.ToLocalTime();
//update the document header if there is any change
var header = Database.Set<DocumentHeader>()
.FirstOrDefault(x => x.Id == value.Header.Id);
if (header != null)
{
value.Header.DocumentLines = header.DocumentLines;
value.Header.DocumentNumber = header.DocumentNumber;
Database.Entry<DocumentHeader>(header)
.CurrentValues.SetValues(value.Header);
}
else
{
Database.Set<DocumentHeader>().Add(value.Header);
}
// If entity exists, set current values to atomic properties
// Otherwise, insert as new
var entity = Database.Set<InvoiceLine>()
.FirstOrDefault(x => x.Id == id);
if (entity != null)
{
Database.Entry<InvoiceLine>(entity)
.CurrentValues.SetValues(value);
FixNavigationProperties(ref entity, value);
}
else
{
FixNavigationProperties(ref value);
Database.Set<InvoiceLine>().Add(value);
}
if (value is ISynchronizable)
(value as ISynchronizable).LastUpdated = DateTime.UtcNow;
// Save changes and handle errors
SaveChanges();
return new HttpResponseMessage(HttpStatusCode.OK);
}