我是ASP.NET MVC的新手,需要一些帮助
当通过post触发“P01”动作时,我将接收强类型模型作为参数,更改此模型实例的属性并调用“return View(model);”。
在视图中使用“@ Html.TextBoxFor(m => m.p01campo01)”语法。
有人here遇到了类似的问题,并建议使用我使用的语法
有人here正在使用“<%= Html.TextBox(”Person.LastName“,ViewData.Model.LastName)%>”语法。
问题是当呈现视图时,文本框具有最后发布的值,而不是我在控制器中指定的值。
感谢所有试图在这里帮助我的人,我给出了第一个有效的答案。
有我的代码:
*************************************************
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>
}
*************************************************
答案 0 :(得分:5)
默认情况下不会呈现帖子中的模型更改。相反,它使用模型中传递给控制器方法的内容。要解决此问题,请尝试添加:
ModelState.Clear();
在RedirectToAction之前。
答案 1 :(得分:5)
因为它是一个HttpPost HTML帮助器首先查看POSTed数据,然后才查看模型。
您必须从州删除该属性:
[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();
BTW,在MVC3上,你可以使用[HttpPost]
和[HttpGet]
[Acceptverb(...)]
答案 2 :(得分:0)
这是一个非常难看的解决方法,你可以尝试
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})
}
}
答案 3 :(得分:0)
忽略下面的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);
}
使用post-redirect-get pattern:
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")) {//...}