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