在c# MVC 5 Internet应用程序中,我有一个HTTP Get Edit操作结果,它获得一个对象,并将该对象放置在ViewModel中,然后显示在视图中。
ViewModel中的一个字段是视图中未编辑的值。在HTTP Post Edit操作中,视图中未编辑的值被重置。
我如何保持这个值,使它是相同的值在HTTP Post方法作为HTTP Get方法?
Thanks in advance
编辑
下面是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编辑操作结果代码中,mapLocationViewModel。mapCompanyForeignKeyId重置为0,此值在HTTP Get Edit Action结果中被设置为一个数字。
你应该尝试隐藏输入。使用Razor语法,它将是:
@using (Html.BeginForm())
{
@Html.HiddenFor(model => model.YourProperty)
}
YourProperty将不可见,但它的值将在发送给POST方法的视图模型中。你也可以使用HiddenInputAttribute:
[HiddenInput(DisplayValue=false)]
public int YourProperty {get; set;}
如果您在表单中使用@Html.TextboxFor(m => m.MyField)
或类似的助手,默认情况下,它应该自动吐出每个字段的所有现有值,因此您应该看到所有值,无论是否修改。当它被发布时,每个包含的字段将被序列化。如果你使用helper,你不必担心命名约定为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);
...
}