Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.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
Asp.net mvc 在Asp.NETMVC视图中,不呈现控制器对模型所做的更改_Asp.net Mvc_Asp.net Mvc 3_Razor - Fatal编程技术网

Asp.net mvc 在Asp.NETMVC视图中,不呈现控制器对模型所做的更改

Asp.net mvc 在Asp.NETMVC视图中,不呈现控制器对模型所做的更改,asp.net-mvc,asp.net-mvc-3,razor,Asp.net Mvc,Asp.net Mvc 3,Razor,我是ASP.NET MVC新手,需要一些帮助。 当post触发“P01”操作时,我收到强类型模型作为参数,更改此模型实例的属性并调用“返回视图(模型)”。 在视图中,im使用“@Html.TextBoxFor(m=>m.p01campo01)”语法。 有人遇到了类似的问题,并得到了使用我使用的语法的建议。 有人正在使用“”语法。 问题在于当呈现视图时,文本框具有上次发布的值,而不是我在控制器中指定的值 感谢所有在这里帮助我的人,我把第一个答案放在第一个答案上 这是我的代码: **********

我是ASP.NET MVC新手,需要一些帮助。
当post触发“P01”操作时,我收到强类型模型作为参数,更改此模型实例的属性并调用“返回视图(模型)”。
在视图中,im使用“@Html.TextBoxFor(m=>m.p01campo01)”语法。
有人遇到了类似的问题,并得到了使用我使用的语法的建议。
有人正在使用“”语法。
问题在于当呈现视图时,文本框具有上次发布的值,而不是我在控制器中指定的值

感谢所有在这里帮助我的人,我把第一个答案放在第一个答案上

这是我的代码:

*************************************************
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Globalization;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Security;

namespace MyTest.Models
{
    //-------
    public class testePg01
    {        
        [DataType(DataType.Text)]
        [Display(Name = "p01campo01")]
        public string p01campo01 { get; set; }

        [DataType(DataType.Text)]
        [Display(Name = "p01campo02")]
        public string p01campo02 { get; set; }

    }
    //-------
}
*************************************************

*************************************************
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using MyTest.Models;

namespace MyTest.Controllers
{
    public class TesteController : Controller
    {
        //-------
        [AcceptVerbs(HttpVerbs.Get)]        
        public ActionResult P01()
        {
            return View();
        }
        //-------
        [AcceptVerbs(HttpVerbs.Post)]
        [ValidateAntiForgeryToken]
        public ActionResult P01(testePg01 model)
        {
            model.p01campo01 = model.p01campo01 + "#updatedHereButNotInView";
            model.p01campo02 = model.p01campo02 + "#updatedHereButNotInView";
            return View(model); // it dont return updated
        }
        //-------

    }
}
*************************************************

*************************************************
@model MyTest.Models.testePg01

@{
    ViewBag.Title = "P01";
}

<h2>P01</h2>

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>

@Html.ValidationSummary(true, "Erro na pagina.")

@using (Html.BeginForm()) {
    @Html.AntiForgeryToken()
    <div>    
        <fieldset>
            <legend>Test P01</legend>

            <div class="editor-label">
                @Html.LabelFor(m => m.p01campo01)
            </div>
            <div class="editor-field">
                @Html.TextBoxFor(m => m.p01campo01)
                @Html.ValidationMessageFor(m => m.p01campo01)
            </div>

            <div class="editor-label">
                @Html.LabelFor(m => m.p01campo02)
            </div>
            <div class="editor-field">
                @Html.TextBoxFor(m => m.p01campo02)
                @Html.ValidationMessageFor(m => m.p01campo02)
            </div>
            <p>
                <input type="submit" value="P01" />
            </p>
        </fieldset>
    </div>
}
*************************************************
*************************************************
使用制度;
使用System.Collections.Generic;
使用System.ComponentModel.DataAnnotations;
利用制度全球化;
使用System.Linq;
使用System.Web;
使用System.Web.Mvc;
使用System.Web.Security;
名称空间MyTest.Models
{
//-------
公共类测试PG01
{        
[数据类型(DataType.Text)]
[显示(Name=“p01campo01”)]
公共字符串p01campo01{get;set;}
[数据类型(DataType.Text)]
[显示(Name=“p01campo02”)]
公共字符串p01campo02{get;set;}
}
//-------
}
*************************************************
*************************************************
使用制度;
使用System.Collections.Generic;
使用System.Linq;
使用System.Web;
使用System.Web.Mvc;
使用MyTest.Models;
命名空间MyTest.Controllers
{
公共类控制器:控制器
{
//-------
[接受动词(HttpVerbs.Get)]
公共行动结果P01()
{
返回视图();
}
//-------
[接受动词(HttpVerbs.Post)]
[ValidateAntiForgeryToken]
公共行动结果P01(testePg01型号)
{
model.p01campo01=model.p01campo01+“#此处更新,但不查看”;
model.p01campo02=model.p01campo02+“#此处已更新,但未查看”;
返回视图(模型);//它不返回更新的
}
//-------
}
}
*************************************************
*************************************************
@型号MyTest.Models.testePg01
@{
ViewBag.Title=“P01”;
}
P01
@ValidationSummary(true,“Erro na pagina.”)
@使用(Html.BeginForm()){
@Html.AntiForgeryToken()
测试P01
@Html.LabelFor(m=>m.p01campo01)
@Html.TextBoxFor(m=>m.p01campo01)
@Html.ValidationMessageFor(m=>m.p01campo01)
@Html.LabelFor(m=>m.p01campo02)
@Html.TextBoxFor(m=>m.p01campo02)
@Html.ValidationMessageFor(m=>m.p01campo02)

} *************************************************
这是一个非常难看的解决方法,您可以尝试

 public class TesteController : Controller
    {
        //-------
        [AcceptVerbs(HttpVerbs.Get)]        
        public ActionResult P01(string val1,string val2)
        {
            var model = new testePg01();
            if(!(String.IsEmptyOrNull(val1)&&String.IsEmptyOrNull(val2)))
                  { 
                       model.p01campo01  = val1;
                       model.p01campo02 = val2;

                  }
            return View(model);
        }
        //-------
        [AcceptVerbs(HttpVerbs.Post)]
        [ValidateAntiForgeryToken]
        public ActionResult P01(testePg01 model)
        {
            model.p01campo01 = model.p01campo01 + "#updatedHereButNotInView";
            model.p01campo02 = model.p01campo02 + "#updatedHereButNotInView";
            return RedirectToAction("P01",{val1=model.p01campo01,val2=model.p01campo02})          
        }
   }

忽略下面的PRG建议。很难看。而是使用:

public ActionResult P01(TestePg01 model)
    {
        model.P01campo01 = model.P01campo01 + "#updatedHereButNotInView";
        model.P01campo02 = model.P01campo02 + "#updatedHereButNotInView";
        ModelState.Clear(); //this will re-populate the view

        return View(model);
    }
使用后重定向获取模式:

    public class TesteController : Controller
{
    //-------
    [AcceptVerbs(HttpVerbs.Get)]
    public ViewResult P01(TestePg01 o)
    {
        return base.View(o);
    }
    //-------
    [AcceptVerbs(HttpVerbs.Post)]
    [ValidateAntiForgeryToken]
    public ActionResult P01Post(TestePg01 model)
    {
        model.P01campo01 = model.P01campo01 + "#updatedHereButNotInView";
        model.P01campo02 = model.P01campo02 + "#updatedHereButNotInView";
        return RedirectToAction("P01", model);
    }
    //-------
}
他认为:

@using (Html.BeginForm("P01Post", "Teste")) {//...}

默认情况下,不会渲染在post中所做的模型更改。相反,它使用模型中传递给控制器方法的内容。要解决此问题,请尝试添加:

ModelState.Clear();

在RedirectToAction之前。

因为它是一个HttpPost HTML助手首先查看发布的数据,然后才查看模型

您必须从状态中删除属性:

[AcceptVerbs(HttpVerbs.Post)]
[ValidateAntiForgeryToken]
public ActionResult P01(testePg01 model)
{
    ModelState.Remove("p01campo01");
    ModelState.Remove("p01campo02");

    model.p01campo01 = model.p01campo01 + "#updatedHereButNotInView";
    model.p01campo02 = model.p01campo02 + "#updatedHereButNotInView";

    return View(model);         
}
ModelState.Clear();
由于ModelState是一个字典,您还可以使用
Clear()
从状态中删除所有属性:

[AcceptVerbs(HttpVerbs.Post)]
[ValidateAntiForgeryToken]
public ActionResult P01(testePg01 model)
{
    ModelState.Remove("p01campo01");
    ModelState.Remove("p01campo02");

    model.p01campo01 = model.p01campo01 + "#updatedHereButNotInView";
    model.p01campo02 = model.p01campo02 + "#updatedHereButNotInView";

    return View(model);         
}
ModelState.Clear();

顺便说一句,在MVC3上,您可以使用
[HttpPost]
[HttpGet]
而不是
[Acceptverb(…)]

非常感谢,您的第二个答案对我很有用。我也改成了[HttpPost]。我不明白第一个答案,您是否让我删除“[AcceptVerbs(HttpVerbs.Post)]”?我为get和post创建了一个操作。你做得对。一个动作要发布,另一个动作要获取。我刚才说你可以用
[HttpPost]
替换
[AcceptVerbs(HttpVerbs.Post)]
,用
[HttpGet]
替换
[AcceptVerbs(HttpVerbs.Get)]
。他们的想法完全一样,但这样更容易理解。这只是一个细节:)我是MVC的新手,从来没有听过PRG,我在这里找到了一个关于它的链接:这里:我在这里找到:也是,PRG是必要的?谢谢,移动ModelState.Clear();现在就结束。