2014-02-17 45 views
6

我有開機自檢合格值問題,在ASP.NET MVC 4 這是我在用戶控制器操作:如何通過POST在ASP.NET MVC傳遞值4

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

在這兩種方式顯示接收的行動,而不是空的實際值。

+2

值Model.Id和Model.UserName實際上可能爲null嗎?您是否可以複製粘貼HTML表單的HTML源代碼,如瀏覽器中呈現的那樣?可能不太可能,但只是爲了檢查。 –

+0

這是不可能的,因爲我也嘗試了硬編碼變量。 '

發帖「uid =」1「uname =」user1「>' – user3321042

+0

我很困惑。我沒有看到任何隱藏的輸入字段。另外,你可以將你的源添加到你的問題的主體。 –

回答

10

您的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。在不使用@的前提下,引擎不知道您正在嘗試輸出返回的字符串。它只是認爲你在調用一種方法。

+0

謝謝非常! – user3321042

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

(編碼在記事本等等未經測試,但應該工作。)

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

對於接收數據的動作 這不是一個好的方法。這種方法可以提供許多安全漏洞,如數據注入。 ,基本上很多領域。

正確的做法是創建一個模型(或視圖模型,如果你不想堅持的數據),使視圖和控制器之間的正確指導:

視圖模型:

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(); 
} 
+1

ViewModel不能防止注入問題。如果在ViewModel中傳遞的值很多,當然很方便,但無論是ViewModel還是離散值,它仍然通過模型聯編程序運行。 –

+0

好。我會更新答案。感謝提示。 –