Отправка значения DropDownList в контроллер MVC
Я пытаюсь взять информацию из DropDownList и опубликовать SelectListItem "Значение" в другой метод ActionResult в контроллере. Контроллер, которому он будет передан, примет целочисленное значение и будет использовать его в другом запросе.
Мой метод контроллера для заполнения 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 не были указаны, но я не уверен, что они даже необходимы в данный момент.
Любой совет или помощь будет принята с благодарностью, большое спасибо!
РЕДАКТИРОВАТЬ:
Теперь у меня есть представление для 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);
}
Взгляд на практику выглядит следующим образом:
@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>
Все хорошо, пока я не попытаюсь перейти на следующую страницу сетки или попытаться отсортировать сетку. Когда я получаю сообщение об ошибке "Ошибка сервера" в "/" приложении. Этот ресурс не может быть найден.
1 ответ
Есть много способов достичь этого. Вы можете использовать стандарт <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. Таким образом, вы могли бы, например, дать вашему выпадающему списку идентификатор и иметь ссылку, по которой он будет вызывать действие целевого контроллера, посылая ему выбранное значение, используя 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.
}