繁体   English   中英

MVC3:覆盖HTTPPost操作方法中的Model值

[英]MVC3 : Overriding the Model values in HTTPPost action method

我正在努力学习MVC3。 我已经使用TextBoxFor HTML帮助控件来保持多个帖子后面的值。

令人惊讶的是,价值是持久的,但在视图中没有反映出来。

我的Model类看起来像这样:

   public class FileViewModel
    {
        public string FileName { get; set; }
        public string ValidationMsg { get; set; }

    }

控制器中的My Actions方法如下所示:

  public ActionResult DemoFormElements()
    {

    return View();
    }

[HttpPost]
public ActionResult DemoFormElements(FileViewModel fVM)
{
    fVM.FileName = "Overridden Text" + fVM.FileName ;

    return View(fVM);
}

我的视图如下所示:

@using (@Html.BeginForm())
{
    if (Model != null)
    {
        @Html.LabelFor(b => b.FileName)
        @Html.TextBoxFor(n => n.FileName, Model.FileName)
    }
    else
    {
        @Html.LabelFor(b => b.FileName)
        @Html.TextBoxFor(n => n.FileName)
    }        

    <input type="submit" id="SubmitBtn" value="Ok" />
}

当我通过单击确定按钮回发时,我能够获得我在文本框中输入的值,但是在控制器中我试图将该值附加到“嗨”并期望在我的视图中附加值,这是没有发生...

我看到控件的价值是持久的(无论我输入什么),但没有改变:(请帮我提一些线索,如果它是预期的行为或我在这里做任何错误?

这有几个问题。 在回发期间,您无法覆盖模型中的值,因为MVC将覆盖该值并保留旧值,以便在出现错误时重新显示它们。 一般来说,您也不应该从POST处理程序返回视图,您应该使用PRG(Post-Redirect - Get)模式。 这样做是为了如果用户在浏览器中单击“刷新”,则不会再次POST。 所以,说了这么多,我会按如下方式更改控制器:

public ActionResult DemoFormElements()
{
    var viewModel = new FileViewModel();

    if( TempData.ContainsKey( "UpdatedFilename" )
    {
        viewModel = TempData["UpdatedFilename"];
    }

    return View( viewModel );
}

[HttpPost]
public ActionResult DemoFormElements(FileViewModel fVM)
{
    TempData["UpdatedFilename"] = "Overridden Text" + fVM.FileName;

    return RedirectToAction( "DemoFormElements" );
}

这也将简化您的视图,因为您不必对模型进行空检查,您将始终拥有模型。

@using (@Html.BeginForm())
{
    @Html.LabelFor(model => model.FileName)
    @Html.TextBoxFor(model => model.FileName)

    <input type="submit" id="SubmitBtn" value="Ok" />
}

您问题的直接解决方案可能是:

  1. 在控制器Post方法中,使用ModelState.Remove(“[Mode的属性名称]”),然后使用Controller为其分配新值。 它应该是:ModelState.Remove(“FileName”);

  2. 或者使用ModelState.Clear():这会强制页面忘记所有先前的值并清除所有先前的条目。

  3. 或者在视图页面上,将Html.TextBoxFor()更改为特定模型属性的Html.TextBox()。

  4. 或者按照Craig上面的建议使用PRG模式:(重定向后 - 获取模式)。

从这些替代方案中选择一种符合您需求的解决方案。

我会为get动作返回一个viewModel

    public ActionResult Index()
    {
        return View(new FileViewModel());
    }

我会简化视图

<span>@Model.FileName</span>
@using (@Html.BeginForm())
{
    @Html.LabelFor(m => m.FileName)
    @Html.TextBoxFor(m => m.FileName)
    <input type="submit" id="SubmitBtn" value="Ok" />
}

还请在提交后阅读此MVC2 TextBoxFor值未更新?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM