[英]pass selected dropdown list value from View to Controller
我想從我的View中將參數(字符串)傳遞給我的Controller。 該值應該是從視圖中的下拉列表中選擇的值。 按鈕單擊后調用該方法,但在Controller中,參數始終為null。
在視圖中:
@using (Html.BeginForm("Send", "Overview", FormMethod.Get))
{
<p>Email: @Html.DropDownList("Emails", Model.GetEmails())
<input type="submit" value="Send" />
</p>
}
在控制器中:
public ActionResult Send(string email)
{
// email is always null!
return null;
}
在概述模型中:
private List<SelectListItem> emails;
...
public Overview()
{
emails = new List<SelectListItem>();
emails.Add(new SelectListItem() { Text = "a@b.com", Value = "a@b.com", Selected = true });
emails.Add(new SelectListItem() { Text = "b@c.com", Value = "b@c.com", Selected = false });
emails.Add(new SelectListItem() { Text = "c@d.com", Value = "c@d.com", Selected = false });
}
...
public List<SelectListItem> GetEmails()
{
return emails;
}
你能幫我解決這個問題嗎? 我錯過了什么? (順便說一句,不要介意控制器現在返回null請:))。
根據你的術語,我猜你對所發生的事情感到困惑。 您永遠不會從視圖向控制器發送任何內容。 相反,視圖是組裝Html以發送到Web瀏覽器的東西。 所以實際發生的是這樣的:
/MyApp/Overview
MyAppController
類上調用Overview
方法 <form method=POST action="/MyApp/Send>
) MyAppController
類上調用Send
方法 email
的字符串參數,並嘗試使用模型綁定在提交的表單數據中查找此信息 Send
方法(如果可用) 你沒有為我提供足夠的上下文來分析錯誤,但我的猜測是@Html.DropDownList("Emails", Model.GetEmails())
正在生成類似<select name="Emails"> ....</select>
。 這意味着當模型綁定發生時,它正在尋找提交的“電子郵件”輸入,但什么也沒找到。 而是嘗試使用@Html.DropDownList("email", Model.GetEmails())
來使其工作。
從語義上講,這更加正確,因為當控件顯示電子郵件(復數)時,用戶實際上通過選擇電子郵件(單數) 與其進行交互 。 可以把它想象成只是一個文本框,你不會用復數形式命名。
我應該注意一下,你在這里有幾個巨大的安全漏洞。 通過將電子郵件地址作為輸入到您的方法中,似乎任何人都可以在他們的瀏覽器中打開開發人員工具並使用您的服務將電子郵件發送到任何電子郵件地址! 垃圾郵件發送者喜歡找到這樣的無擔保服務。 一個更好的解決方案是讓生成的選擇列表中的值為您想要通過電子郵件發送的用戶的ID,並在Send
方法中將id作為輸入。 另外,絕對不能通過Http GET訪問Send
(所以在那里加上[HttpPost]屬性!)。 如果它允許GET,即使它在登錄頁面后面,我也可以欺騙登錄的用戶使用<img src="http://yoursite.com/MyApp/Send/?email=personIWantToSpam@example.com" />
訪問表單<img src="http://yoursite.com/MyApp/Send/?email=personIWantToSpam@example.com" />
每次訪問該頁面時,都會有人收到垃圾郵件。
你可以在你的模型中使用一個字符串,
public string emails { get; set; };
然后在你的視圖上使用DropDownListFor
,
@Html.DropDownListFor(x => x.emails, Model.GetEmails())
並在POST
上直接從模型中獲取值。
[HttpPost]
public ActionResult Send(OverviewViewModel overviewModel)
{
//here is the value from the drop down
var theEmail = overviewModel.emails;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.