2012-10-04 2 views
0

Я пытаюсь извлечь информацию из DropDownList и опубликовать значение SelectListItem для другого метода ActionResult в контроллере. Контроллер, который будет передан, будет принимать целочисленное значение и использовать его в другом запросе.Публикация значения DropDownList для MVC-контроллера

Мой метод управления для Наполнение DropDownList выглядит следующим образом:

public ActionResult SelectCategory() 
{ 
    var model = new TestTypesViewModel(); 

    var query = (from ab in db.Tbl_Admin_Batch 
       from ub in db.Tbl_Admin_User_Batch 
       where ub.User_Id == 45875 && ab.Batch_Id == ub.Batch_Id 
       select ab).ToList(); 

    model.Test_Types = query.Select(c => new SelectListItem 
     { 
      Text = c.Batch_Name, 
      Value = c.Batch_Id.ToString() 
     }).ToList(); 

    return View(model); 

Мои ViewModel для TestTypesViewModel выглядит следующим образом:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.Mvc; 

namespace HFI_Assessment_Administration.ViewModels 
{ 
    public class TestTypesViewModel 
    { 
     public int Batch_ID { get; set; } 
     public string Test_Type { get; set; } 

     public IEnumerable<SelectListItem> Test_Types { get; set; } 
    } 
} 

Я новичок в MVC и пытается держать вещи простыми, Я знаю, что Batch_ID и Test_Type не указаны, но я не уверен, что они даже необходимы в этот момент.

Любой совет или помощь были бы весьма признательны, большое спасибо!

EDIT:

теперь у меня есть вид на SelectCategory следующим образом:

@model HFI_Assessment_Administration.ViewModels.TestTypesViewModel 

@{ 
    ViewBag.Title = "SelectCategory"; 
} 

@using (Html.BeginForm("Practice", "WebFormUserList")) 
{ 
    @Html.DropDownListFor(x => x.Batch_ID, Model.Test_Types) 
    <input type="submit" /> 
} 

Контроллер он передается, заключается в следующем:

[HttpPost] 
public ActionResult Practice(TestTypesViewModel model, int Parent_ID = 45875) 
{ 
    var query = (from u in db.Users 
       join ur in db.User_Relationship on u.User_ID equals ur.Child_ID 
       join ub in db.Tbl_Admin_User_Batch on u.User_ID equals ub.User_Id 

       join ut in db.User_Tests on u.User_ID equals ut.User_ID into ps 
       from ut in ps.DefaultIfEmpty() 

       join lu in db.Lookups on u.First_LanguageID equals lu.LookupID 

       where ur.Parent_ID == Parent_ID && ub.Batch_Id == model.Batch_ID 

       group new { u, lu, ut } by new 
       { 
        u.User_ID, 
        u.Forename, 
        u.Surname, 
        u.Client_Code, 
        u.User_Name, 
        u.Password, 
        u.Email, 
        u.Gender, 
        u.Report_date, 
        u.EmailDate, 
        u.Job_Function, 
        lu.LookupValue 
       } into g 

       select new UserViewModel 
        { 
         User_ID = g.Key.User_ID, 
         Forename = g.Key.Forename, 
         Surname = g.Key.Surname, 
         Client_Code = g.Key.Client_Code, 
         User_Name = g.Key.User_Name, 
         Password = g.Key.Password, 
         Email = g.Key.Email, 
         Gender = g.Key.Gender, 
         Report_Date = g.Key.Report_date, 
         Email_Date = g.Key.EmailDate, 
         Test_Count = g.Count(p => p.ut.Test_ID != null), 
         Test_Completed = g.Count(p => p.ut.Completed != null), 
         Job_Function = g.Key.Job_Function, 
         Lookup_Value = g.Key.LookupValue 
        }).ToList(); 

     return View(query); 
    } 

The View для Практика заключается в следующем:

@model IEnumerable<HFI_Assessment_Administration.ViewModels.UserViewModel> 

@{ 
    ViewBag.Title = "ChildUsers"; 
} 

<h2>Practice</h2> 

<div> 
    @{ 
     var grid = new WebGrid(Model); 
    } 

    @grid.GetHtml(

    tableStyle: "webgrid", 
    headerStyle: "webgrid-header", 
    footerStyle: "webgrid-footer", 
    alternatingRowStyle: "webgrid-alternating-row", 
    selectedRowStyle: "webgrid-selected-row", 
    rowStyle: "webgrid-row-style", 

    columns: grid.Columns 
    (
     grid.Column(columnName:"User_ID", header: "User ID", style: "text-align-center"), 
     grid.Column(columnName:"Forename", header: "Forename", style: "text-align-center"), 
     grid.Column(columnName:"Surname", header: "Surname", style: "text-align-center"), 
     grid.Column(columnName:"Client_Code", header: "Client Code", style: "text-align-center"), 
     grid.Column(columnName:"User_Name", header: "User Name", style: "text-align-center"), 
     grid.Column(columnName:"Password", header: "Password", style: "text-align-center"), 
     grid.Column(columnName:"Email", header: "Email", style: "text-align-center"), 
     grid.Column(columnName:"Gender", header: "Gender", style: "text-align-center"), 
     grid.Column(columnName:"Report_Date", header: "Report Date", style: "text-align-center"), 
     grid.Column(columnName:"Email_Date", header: "Email Date", style: "text-align-center"), 
     grid.Column(columnName:"Test_Count", header: "Count", style: "text-align-center"), 
     grid.Column(columnName:"Test_Completed", header: "Completed", style: "text-align-center"), 
     grid.Column(columnName:"Job_Function", header: "Job Function", style: "text-align-center"), 
     grid.Column(columnName:"Lookup_Value", header: "Language", style: "text-align-center") 
     )   
    ) 
</div> 

Все в порядке, пока я не попытаюсь перейти на следующую страницу сетки или попытаться отсортировать сетку. Когда я получу ошибку, Ошибка сервера в приложении «/». Ресурс не может быть найден.

ответ

0

Существует много способов достичь этого. Вы можете либо использовать стандартный тег <form>, либо использовать AJAX для отправки значения.

Давайте посмотрим первый случай:

@model TestTypesViewModel 
@using (Html.BeginForm("SomeAction", "SomeController")) 
{ 
    @Html.DropDownListFor(x => x.Test_Type, Model.Test_Types) 
    <button type="submit">OK</button> 
} 

и в настоящее время в целевом действии:

[HttpPost] 
public ActionResult SomeAction(TestTypesViewModel model) 
{ 
    // model.Test_Type will contain the selected value here 

    // Notice that if you intend to return the same view as the GET action 
    // (SelectCategory.cshtml) you should assign the Test_Types property on 
    // your model by querying your database the same way you did in the GET action 
    // before passing this model to the view. If on the other hand you intend to 
    // redirect here you don't need to assign it. 
} 

Вторая возможность заключается в том, чтобы использовать AJAX. Таким образом, вы могли бы, например, дать вашему DROPDOWNLIST идентификатор и иметь некоторую ссылку, при нажатии на которую будет ссылаться на действие целевой контроллер посылает его выбранное значение с помощью AJAX:

@Html.DropDownListFor(x => x.Test_Type, Model.Test_Types, new { id = "testTypeDdl" }) 
@Html.ActionLink("click me", "SomeAction", null, new { id = "myLink" }) 

, а затем, когда некоторые кнопки или нажатия на ссылку использования в $.ajax запрос:

$(function() { 
    $('#myLink').click(function() { 
     $.ajax({ 
      url: this.href, 
      type: 'GET', 
      cache: false, 
      data: { selectedValue: $('#testTypeDdl').val() }, 
      success: function(result) { 
       alert('The value was submitted to the server'); 
      } 
     }); 
     return false; 
    }); 
}); 

и теперь ваше действие контроллера может иметь следующую подпись:

public ActionResult SomeAction(string selectedValue) 
{ 
    // Process the selected value here and return some result. 
    // This result could either be a PartialView or a JsonResult 
    // depending on your requirements. 
} 
+0

Ого, спасибо за быстрый ответ, я дам, что идти теперь d видеть, где я получаю с этим! – user1688784

+0

Один быстрый вопрос, что вы подразумеваете под своим комментарием: // Обратите внимание, что если вы намерены вернуть тот же вид, что и действие GET // (SelectCategory.cshtml), вы должны назначить свойство Test_Types на // вашей модели, запросив вашу базу данных так же, как вы делали в действии GET // перед передачей этой модели в представление. Если, с другой стороны, вы намерены использовать // перенаправлять сюда, вам не нужно назначать его. – user1688784

+0

Я имею в виду, что если вы вернете View (model); 'из вашего действия POST вам нужно присвоить значение' model.Test_Types = ... 'так же, как вы делали в действии GET. –

Смежные вопросы