Asp.net mvc ModelState、TempData、ViewModel问题-自动覆盖新的ViewModel值
最好用以下代码来解释此问题:Asp.net mvc ModelState、TempData、ViewModel问题-自动覆盖新的ViewModel值,asp.net-mvc,asp.net-mvc-5,Asp.net Mvc,Asp.net Mvc 5,最好用以下代码来解释此问题: public async Task<ActionResult> Index() { if (TempData.ContainsKey("ModelState")) { ModelState.Merge((ModelStateDictionary)TempData["ModelState"]); var viewModelA= new ViewModel
public async Task<ActionResult> Index()
{
if (TempData.ContainsKey("ModelState"))
{
ModelState.Merge((ModelStateDictionary)TempData["ModelState"]);
var viewModelA= new ViewModelA
{
FirstName = "John"
}
return View(viewModelA);
}
}
[HttpPost]
public async Task<ActionResult> IndexPostActionMethod(ViewModelB model)
{
if (ModelState.IsValid)
{
var result = await DoSomeStuff();
if (result.Succeeded)
{
DoSomeOtherStuff();
}
else
{
AddErrors(result);
}
}
TempData["ModelState"] = ModelState;
return RedirectToAction("Index");
}
公共异步任务索引()
{
if(TempData.ContainsKey(“ModelState”))
{
合并((ModelStateDictionary)TempData[“ModelState”]);
var viewModelA=新的viewModelA
{
FirstName=“约翰”
}
返回视图(viewModelA);
}
}
[HttpPost]
公共异步任务IndExpostationMethod(ViewModelB模型)
{
if(ModelState.IsValid)
{
var result=等待dosomething();
if(result.successed)
{
DoSomeOtherStuff();
}
其他的
{
加法器(结果);
}
}
TempData[“ModelState”]=ModelState;
返回操作(“索引”);
}
这里的问题是,当我发布到
indexpostationmethod
并且DoSomeStuff()
出于某种原因返回false
时,通过重定向到Index
并在重定向期间将ModelState
保存在TempData
中,然后一旦表单/页面重新显示,就可以重新显示表单/页面,ModelState
(或者从哪里获取值?)中的值被设置为@Html.TextBoxFor(m=>m.FirstName)
的值,而不是我在这里设置的值:var viewModelA=new viewModelA{FirstName=“John”}
。为什么我不能重写该值,它从哪里获得?这就像框架自动更新viewModelA
,使用ModelStatDictionary
中的任何内容,即使我使用新值创建了一个新的viewModelA
。不要这样做。处理GET-POST重定向周期的方法是:
public async Task<ActionResult> Index()
{
var model = new ViewModel
{
FirstName = "John"
}
return View(model);
}
[HttpPost]
public async Task<ActionResult> Index(ViewModel model)
{
if (ModelState.IsValid)
{
var result = await DoSomeStuff();
if (result.Succeeded)
{
DoSomeOtherStuff();
}
else
{
AddErrors(result);
}
}
return View(model);
}
基本上,您可以将各个文章片段分解为视图模型,这些视图模型共同构成一个大视图模型。然后,模型验证只遵循容器的实际内部视图模型实例。因此,例如,如果您仅回发到
FooTab.FooRequiredField
,则仅实例化FooTab
。其他两个视图模型属性将保持为空,并且不会在内部进行验证(即,它们具有必填字段这一事实并不重要)。构建一个复杂的shoppingcart页面,一个单页应用程序类型的应用程序,其中一个大的viewmodel用于GET操作,另一个小的viewmodel用于POST操作。调用哪个POST操作取决于用户输入。需要保留路由/url,并在后续页面视图中提供内置验证状态,这就是为什么我将ModelState从一个actionmethod传递到另一个actionmethod。可能会产生一个新问题,但因为您似乎对这些类型的场景了解很多。如果GET操作有一个较大的viewmodel,并且只想将值的子集传递给与GET操作同名的POST操作,并将viewmodel作为参数,以及ModelState.IsValid,则需要计算为true;你会怎么做?使用tabs jquery插件顺便说一句,这样一些值在POST上会为null,因此ModelState.IsValid将计算为false,这不是我想要的,因为这些文本框对用户是隐藏的。
public class IndexViewModel
{
public SomeTabViewModel SomeTab { get; set; }
public AnotherTabViewModel AnotherTab { get; set; }
public FooTabViewModle FooTab { get; set; }
}
public class SomeTabViewModel
{
[Required]
public string SomeRequiredField { get; set; }
}
public class AnotherTabViewModel
{
[Required]
public string AnotherRequiredField { get; set; }
}
public class FooTabViewModel
{
[Required]
public string FooRequiredField { get; set; }
}