即使未修改该值,也要在ViewModel中保留值

时间:2014-07-28 05:32:17

标签: c# asp.net-mvc-5 viewmodel edit actionresult

在C#MVC 5 Internet应用程序中,我有一个HTTP Get Edit操作结果,它获取一个对象,并将此对象放在ViewModel中,然后在View中显示。

ViewModel中的一个字段是未在视图中编辑的值。在HTTP Post Edit操作中,视图中未编辑的值已重置。

如何保持此值,使其与HTTP Get方法在HTTP Post方法中的值相同?

提前致谢

修改

这是ViewModel代码:

public class MapLocationViewModel
{
    [Editable(false)]
    public int mapCompanyForeignKeyId { get; set; }
    public MapLocation mapLocation { get; set; }
}

以下是HTTP Get Edit Action结果底部的代码,其中设置了mapCompanyForeignKeyId:

MapLocationViewModel mapLocationViewModel = new MapLocationViewModel();
mapLocationViewModel.mapLocation = maplocation;
mapLocationViewModel.mapCompanyForeignKeyId = maplocation.mapCompanyForeignKeyId;
return View(mapLocationViewModel);

以下是HTTP Post Edit Action结果代码:

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Edit(MapLocationViewModel mapLocationViewModel)

在上面的HTTP编辑操作结果代码中,将此值设置为HTTP Get Edit Action结果中的数字后,mapLocationViewModel.mapCompanyForeignKeyId将重置为0。

2 个答案:

答案 0 :(得分:0)

如果您在表单中使用@Html.TextboxFor(m => m.MyField)或类似的帮助程序,默认情况下,它应自动吐出每个字段的所有现有值,因此您应该看到所有值是否已修改。发布时,每个包含的字段都将被序列化。如果您使用帮助程序,您将不必担心将命名约定为Razor,并且模型绑定器将为您完成工作。

检查进入POST操作的请求,看是否是模型绑定问题或客户端问题。如果您没有在正文中看到所需的成员(或查询字符串,如果是GET),那么您不能从客户端发送它们,这可能是由于字段的不正确序列化/命名,不包括字段在页面中,不将字段的值发送到页面,或包括表单之外的字段,以及其他原因......

示例:

public class MyViewModel
{
    [Required]
    public string Field1 { get; set; }
    [Required]
    public string Field2 { get; set; }
}

...

@model MyViewModel

@using (Html.BeginForm("MyAction", ...)
{
    @Html.LabelFor(m => m.Field1)
    @Html.TextboxFor(m => m.Field1)
    <br />
    @Html.LabelFor(m => m.Field2)
    @Html.TextAreaFor(m => m.Field2)
    <button type="submit">Submit</button>
}

...

[HttpPost]
public ActionResult MyAction(MyViewModel model)
{
    if (!ModelState.IsValid)
         return MyGetAction(model);
    ...
}

答案 1 :(得分:0)

你应该尝试隐藏输入。使用Razor语法,它将是:

@using (Html.BeginForm())
{         
    @Html.HiddenFor(model => model.YourProperty)
}

YourProperty将不可见,但它的值将在发送到POST方法的视图模型中。 您也可以使用HiddenInputAttribute:

[HiddenInput(DisplayValue=false)]
public int YourProperty {get; set;}