如何在ASP.NET MVC 4中通过POST传递值

时间:2014-02-17 22:51:22

标签: c# asp.net-mvc-4 http-post

我在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>

以这两种方式显示动作接收空值而不是实际值。

4 个答案:

答案 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));
}

(在记事本中编码未经测试,但应该有效。)