2011-10-07 14 views
5

Form verilerini gönderdikten sonra nasıl elde edilir?MVC3 - Bir düğmeyle POST'u anlama

<form target="_self" runat="server"> 
    <p> 
    <select id="BLAHBLAH2"> 
     <option>2010</option> 
     <option>2011</option> 
     <option>2012</option> 
     <option>2013</option> 
    </select> 
    <input type="submit" runat="server" value="Change Year" /> 
    </p> 
</form> 

Bu kontrolörün Index yöntemini vurur. Ancak, Request.Form'da hiçbir şey yok. Niye ya?

İkincisi, ben

<input type="button" yerine type=submit kullanabilir? Yani ajax'i onclick aracılığıyla tanıtmadan.

Son olarak, denetleyicideki farklı bir yönteme nasıl başvuruda bulunabilirim, örn. Create? senin <option> etiketleri

+3

, "runat =" server "' bir web formları değil midir? –

cevap

7

bu runat sunucu etiketleri kaldırmayı deneyin kullanma. ASP.NET MVC'de kullanılmamalıdır. Ayrıca seçiminizin bir adı yok. Bir giriş öğesinin adı yoksa, hiçbir şey göndermez.

<form action="/Home/Create" method="post"> 
    <p> 
    <select id="BLAHBLAH2" name="BLAHBLAH2"> 
     <option value="2010">2010</option> 
     <option value="2011">2011</option> 
     <option value="2012">2012</option> 
     <option value="2013">2013</option> 
    </select> 
    <input type="submit" value="Change Year" /> 
    </p> 
</form> 

Ama ASP.NET MVC formları oluşturmak için doğru yolu HTML yardımcıları kullanmaktır: Ayrıca opsiyon etiketleri bu seçenekler seçilirse değer sunucuya gönderilecek belirtir değer özelliklerini olmalıdır. Sözdizimini kullandığınız görünüm motoruna bağlı olarak farklı olabilir. İşte Ustura görünümü motoru ile bir örnek:

İşte
@model MyViewModel 
@using (Html.BeginForm("Create", "Home")) 
{ 
    <p> 
     @Html.DropDownListFor(x => x.SelectedYear, Model.Years) 
     <input type="submit" value="Change Year" /> 
    </p> 
} 

bazı verilmiş görünümü modeline kesinlikle yazılı görünümü vardır: Bu görünümü oluşturur bazı denetleyici eylem tarafından doldurulur

public class MyViewModel 
{ 
    public string SelectedYear { get; set; } 

    public IEnumerable<SelectListItem> Years 
    { 
     get 
     { 
      return Enumerable 
       .Range(2010, 4) 
       .Select(x => new SelectListItem 
       { 
        Value = x.ToString(), 
        Text = x.ToString() 
       }); 
     } 
    } 
} 

:

public class HomeController: Controller 
{ 
    public ActionResult Index() 
    { 
     var model = new MyViewModel(); 
     return View(model); 
    } 

    [HttpPost] 
    public ActionResult Create(MyViewModel model) 
    { 
     ... model.SelectedYear will contain the selected year 
    } 
} 
+0

Sorumu Razor ile güncelledim. Çeviriyi kolayca yapabilirim. –

+0

@ P.Brian.Mackey, Cevabımı bir Razor örneğiyle güncelledim. –

+0

@DarinDimitrov - Ayrıntı derecenize kadar yayıyorum :) – Josh

2

Yok bir değere sahip: = "server" kesinlikle bir WebForms şey olduğunu

David tarafından belirtildiği gibi
... 
<option value="2010">2010</option> 
... 

, runat, yani 86 edebilirim.

Denetleyicinizde farklı bir yönteme göndermek istiyorsanız, bu yöntemin URL'sini belirtmeniz yeterlidir. Html.BeginForm kullanarak

kolay yolu:

@using (Html.BeginForm("AnotherAction", "ControllerName")) { 
    <!-- Your magic form here --> 
} 

Url.Action

<form action="@Url.Action("AnotherAction")" method="POST"> 
    <!-- Your magic form here --> 
</form> 
+0

Teşekkürler, görevi yerine getirmek için alternatif yaklaşımı görmek güzel. –

0

Ayrıca Kontrolör olarak kullanabilirsiniz

.cshtml dosyasında

adı "sen iste "html nesnesi için DEĞERİ alır

<select id="IDxxx" name="BLAHBLAH2"> 

// İsteği ["]" kullanın.