Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MVC3:重写HTTPPost操作方法中的模型值_C#_Asp.net Mvc_Asp.net Mvc 3_Razor - Fatal编程技术网

C# MVC3:重写HTTPPost操作方法中的模型值

C# MVC3:重写HTTPPost操作方法中的模型值,c#,asp.net-mvc,asp.net-mvc-3,razor,C#,Asp.net Mvc,Asp.net Mvc 3,Razor,我正在努力学习MVC3。我已经使用TextBoxforHTML助手控件在多个回发上持久化该值 令人惊讶的是,该值持续存在,但没有反映在视图中 我的模型类如下所示: public class FileViewModel { public string FileName { get; set; } public string ValidationMsg { get; set; } } 控制器中的我的操作方法如下所示: public Act

我正在努力学习MVC3。我已经使用TextBoxforHTML助手控件在多个回发上持久化该值

令人惊讶的是,该值持续存在,但没有反映在视图中

我的模型类如下所示:

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

    }
控制器中的我的操作方法如下所示:

  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" />
}
我的观点是这样的:

  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" />
}
@使用(@Html.BeginForm())
{
如果(型号!=null)
{
@LabelFor(b=>b.FileName)
@Html.TextBoxFor(n=>n.FileName,Model.FileName)
}
其他的
{
@LabelFor(b=>b.FileName)
@Html.TextBoxFor(n=>n.FileName)
}        
}
当我点击OK按钮发回时,我能够得到我在列表中输入的值 textbox,但在控制器中,我试图将该值附加到“Hi”&在我的视图中期望附加值,但这不会发生

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

这有几个问题。在回发期间,您不能覆盖模型中的值,因为MVC将覆盖这些值并保留旧值,以便在出现错误时重新显示它们。通常,您也不应该这样做例如,如果要从POST处理程序返回视图,则应使用PRG(POST-Redirect-Get)模式。这样,如果用户在其浏览器中单击“刷新”,则不会再次发布。因此,在完成所有这些之后,我将按如下方式更改控制器:

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" />
}
@使用(@Html.BeginForm())
{
@LabelFor(model=>model.FileName)
@Html.TextBoxFor(model=>model.FileName)
}

我会为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" />
}
@Model.FileName
@使用(@Html.BeginForm())
{
@LabelFor(m=>m.FileName)
@Html.TextBoxFor(m=>m.FileName)
}
请同时阅读这篇文章

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

  • 在控制器Post方法中,使用ModelState.Remove(“[Mode's Property Name]”),然后再为其分配控制器的新值。这里应该是:ModelState.Remove(“FileName”)

  • 或者使用ModelState.Clear():这将强制页面忘记所有以前的值并清除所有以前的条目

  • 或者在查看页面上,将特定模型属性的Html.TextBoxFor()更改为Html.TextBox()

  • 或者使用上面Craig建议的PRG模式:(Post-Redirect-Get模式)


  • 从这些可供选择的解决方案中选择一种适合您的需要。

    此外,如果您要添加新文本,最好防止在多次发布增广文本时重复连接(即如果您不这样做,您可能会以“覆盖文本覆盖文本…”结束)当然,这是原始代码的另一个问题。即使OP已经使用了这种方法(这是可能的,因为与ModelState混淆)用户敲打F5键会导致重复连接。因为TempData只在一次重定向后存活,这也解决了该问题。太好了,它开始完美工作…Thx提供所有可能的解决方案:)