在Asp.net MVC 1应用程序的Controller中,我想使用UpdateModel在我的控制器中用POST数据填充变量。我看了几十个例子,但即使是最基本的例子也似乎对我无声。
这是一个非常基本的例子,它只是不起作用。 我做错了什么?
public class TestInfo
{
public string username;
public string email;
}
public class AdminController : Controller
{
public ActionResult TestSubmit()
{
var test = new TestInfo();
UpdateModel(test);//all the properties are still null after this executes
//TryUpdateModel(test); //this returns true but fields / properties all null
return Json(test);
}
}
//Form Code that generates the POST data
<form action="/Admin/TestSubmit" method="post">
<div>
<fieldset>
<legend>Account Information</legend>
<p>
<label for="username">Username:</label>
<input id="username" name="username" type="text" value="" />
</p>
<p>
<label for="email">Email:</label>
<input id="email" name="email" type="text" value="" />
</p>
<p>
<input type="submit" value="Login" />
</p>
</fieldset>
</div>
</form>
答案 0 :(得分:3)
看起来你正试图让控制器根据表单元素更新模型。试试这个:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult TestSubmit(TestInfo test)
{
UpdateModel(test);
return Json(test);
}
在您的代码中,您正在创建一个新的TestModel,而不是让MVC运行时从HttpPost序列化它。我也让自己缠绕在这个轴上,你不是唯一一个!
答案 1 :(得分:2)
制作公共字段的属性:
public class TestInfo
{
public string username {get;set;}
public string email{get;set;}
}
答案 2 :(得分:0)
我对ASP.NET MVC不太熟悉,但你的TestSubmit方法看起来不应该更像这样:
public ActionResult TestSubmit(TestInfo test)
{
UpdateModel(test);
return Json(test);
}
答案 3 :(得分:-1)
在控制器中你应该有两个方法,一个用于响应GET,另一个用于响应POST。
所以,首先要有一个GET方法:
public ActionResult Test ()
{
return View (/* add a TestInfo instance here if you're getting it from somewhere - db etc */);
}
其次,你需要一个POST方法:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Test (TestInfo test)
{
return Json (test);
}
请注意,那里没有UpdateMethod
,ModelBinder会为您做到这一点。