我在ASP.NET MVC 4中通过POST传递值时遇到问题 这是我在用户控制器中的操作:
[HttpPost]
public string Show(int? uid, string uname)
{
return uname + uid.ToString();
}
这就是我尝试在视图中传递值的方式:
@using (Html.BeginForm("Show", "User"))
{
Html.Hidden("uid", Model.Id);
Html.Hidden("uname", Model.UserName);
<input type="submit" value="+"/>
}
HTML:
<form action="/User/Show" method="post"> <input type="submit" value="+"/> </form>
和
@using(Html.BeginForm("Show", "User", FormMethod.Post, new { uid = 1, uname = "user1" }))
{
<input type="submit" value="+"/>
}
HTML:
<form action="/User/Show" method="post" uid="1" uname="user1"> <input type="submit" value="+"/></form>
以这两种方式显示动作接收空值而不是实际值。
答案 0 :(得分:11)
您的HtmlHelpers未呈现。使用Razor语法。
@using (Html.BeginForm("Show", "User"))
{
@Html.Hidden("uid", Model.Id);
@Html.Hidden("uname", Model.UserName);
<input type="submit" value="+"/>
}
说明:
调用Html.Hidden
(或Html.[anything]
)是一种方法,通常会返回IHtmlString
。如果不使用@
infront,引擎就不会知道您正在尝试输出返回的字符串。它只是认为你在调用一种方法。
答案 1 :(得分:3)
对于接收数据的操作,这不是一个好方法。这种方法可以提供许多安全漏洞,例如数据注入。,基本上是很多字段。
正确的做法是创建一个Model(或ViewModel,如果你不想保留数据)在View和Controller之间做出正确的指导:
视图模型:
public class MyViewModel {
public int? uid { get; set; }
public string uname { get; set; }
}
查看:
@model MyProject.ViewModels.MyViewModel
@using (Html.BeginForm("Show", "User"))
{
Html.HiddenFor(model => model.uid);
Html.HiddenFor(model => model.uname);
<input type="submit" value="+"/>
}
控制器:
public ActionResult Show(int modelId) {
var model = context.Model.SingleOrDefault(m => m.ModelId == modelId);
var viewModel = new MyViewModel();
viewModel.uid = model.Id;
viewModel.uname = model.UserName;
return View(viewModel);
}
[HttpPost]
public string Show(MyViewModel viewModel)
{
return viewMode.uname + viewModel.uid.ToString();
}
答案 2 :(得分:2)
您实际上并未在表单中创建隐藏字段。你需要在你面前的@隐藏助手,并在结尾处放下分号。
@using (Html.BeginForm("Show", "User"))
{
@Html.Hidden("uid", Model.Id)
@Html.Hidden("uname", Model.UserName)
<input type="submit" value="+"/>
}
您的硬编码测试不起作用的原因是您的HTML不正确。您不能只想将要发布的值放在<form>
元素上,您需要将它们作为表单中的隐藏字段。
<form action="/User/Show" method="post">
<input type="hidden" name="uid" value="1" />
<input type="hidden" name="uname" value="user1">
<input type="submit" value="+"/>
</form>
答案 3 :(得分:0)
如果你可以使用视图模型会更好。
public class MyViewModel
{
public int? Id {get;set;}
public string UserName {get;set;}
}
public ActionResult Show()
{
return View(new MyViewModel());
}
[HttpPost]
public ActionResult Show(MyViewModel model)
{
return Content(string.format("{0} - {1}", model.Id, model.UserName));
}
(在记事本中编码未经测试,但应该有效。)