簡體   English   中英

將選定的下拉列表值從View傳遞到Controller

[英]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瀏覽器的東西。 所以實際發生的是這樣的:

  • 您的瀏覽器從您的服務器(IIS)請求/MyApp/Overview
  • IIS選擇它並將其發送到Asp.Net
  • Asp.Net Mvc看到了請求,並通過路由數據表明你想在MyAppController類上調用Overview方法
  • 該方法運行並生成模型
  • Asp.Net Mvc將模型傳遞給視圖引擎,該引擎運行您的視圖以生成html
  • 將html返回給IIS,將其發送到您的瀏覽器
  • 您的瀏覽器將html顯示為選擇控件。
  • 用戶進行選擇並單擊表單上的“提交”
  • 瀏覽器對其提交進行編碼,並將其發送到表單的action屬性中的url(例如<form method=POST action="/MyApp/Send>
  • IIS選擇並將其發送給Asp.Net
  • Asp.Net Mvc看到了請求並通過路由數據表明你想在MyAppController類上調用Send方法
  • Asp.Net Mvc發現您的方法需要一個名為email的字符串參數,並嘗試使用模型綁定在提交的表單數據中查找此信息
  • Asp.Net Mvc使用找到的參數值調用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM