Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何编辑相关对象';MVC4中的属性?_C#_Asp.net Mvc_Asp.net Mvc 4_Razor_Restsharp - Fatal编程技术网

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);
}