【问题标题】:How to pass values by POST in ASP.NET MVC 4如何在 ASP.NET MVC 4 中通过 POST 传递值
【发布时间】:2014-02-17 22:51:21
【问题描述】:

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

在这两种方式中,Show 操作都会接收 null 而不是真实值。

【问题讨论】:

  • Model.Id 和 Model.UserName 值是否可能实际上为空?您可以复制粘贴表单的 HTML 源代码,如浏览器中呈现的那样吗?可能不太可能,但只是检查一下。
  • 这是不可能的,因为我也尝试使用硬编码变量。 &lt;form action="/User/Show" method="post"&gt; &lt;input type="submit" value="+"/&gt;&lt;/form&gt;&lt;form action="/User/Show" method="post" uid="1" uname="user1"&gt; &lt;input type="submit" value="+"/&gt;
  • 我很困惑。我在那里看不到任何隐藏的输入字段。另外,您能否将来源添加到问题的主体中。
  • 你知道,你不能像这样在&lt;form&gt;标签中添加属性,正确的方法是&lt;input type="hidden" name="uid" value="1" /&gt;

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


【解决方案1】:

您的 HtmlHelper 没有被渲染。使用 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,引擎不知道您正在尝试输出返回的字符串。它只是认为你在调用一个方法。

【讨论】:

    【解决方案2】:

    对于接收数据的操作,这不是一个好方法。这种方法可以提供许多安全漏洞,例如数据注入。,本质上是很多领域。

    正确的做法是创建一个模型(或一个 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();
    }
    

    【讨论】:

    • ViewModel 不能防止注入问题。如果您在 ViewModel 中传递了许多值当然很方便,但无论是 ViewModel 还是离散值,它仍然会通过模型绑定器运行。
    【解决方案3】:

    您实际上并没有在表单中创建隐藏字段。你需要在你前面的 @ 隐藏助手,并在末尾删除分号。

    @using (Html.BeginForm("Show", "User"))
    {
        @Html.Hidden("uid", Model.Id)
        @Html.Hidden("uname", Model.UserName)
        <input type="submit" value="+"/>
    }
    

    您的硬编码测试不起作用的原因是您的 HTML 不正确。您不能只将要发布的值放在 &lt;form&gt; 元素上,您需要将它们作为表单中的隐藏字段。

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

    【讨论】:

      【解决方案4】:

      如果你可以使用视图模型会更好。

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

      (在记事本中编码所以未经测试,但应该可以工作。)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-10-21
        • 2012-01-14
        • 2015-02-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-21
        相关资源
        最近更新 更多