C# 如何在ASP.NET MVC中将对象的ID从窗体传递到操作
我有一个ASP.NETMVC项目,其中包含基于EF6的实体(模型优先)。所以我的实体都是为我自动生成的。我有一个实体,C# 如何在ASP.NET MVC中将对象的ID从窗体传递到操作,c#,asp.net,asp.net-mvc,razor,C#,Asp.net,Asp.net Mvc,Razor,我有一个ASP.NETMVC项目,其中包含基于EF6的实体(模型优先)。所以我的实体都是为我自动生成的。我有一个实体,站点,我只希望用户在继续之前选择一个站点。我试过几种方法,所有的方法都有效,但它们看起来非常混乱和不必要 我对创建Sites的DropdownList最干净的方法很好奇,然后在提交表单时获取所选站点(通过Id或其他更好的机制) 目前我有: 要求用户选择站点的索引: public ActionResult Index() { ViewBag.Sites = new Sele
站点
,我只希望用户在继续之前选择一个站点
。我试过几种方法,所有的方法都有效,但它们看起来非常混乱和不必要
我对创建Site
s的DropdownList
最干净的方法很好奇,然后在提交表单时获取所选站点(通过Id
或其他更好的机制)
目前我有:
要求用户选择站点的索引:
public ActionResult Index()
{
ViewBag.Sites = new SelectList(db.Sites.ToList(), "Id", "Name");
return View();
}
观点:
@using (Html.BeginForm("SetSite", "Home"))
{
@Html.Label("sites", "Site:");
@Html.DropDownList("Sites", null, new { @class = "selectpicker" });
<div style="width:100%;height:25px"></div>
<button class="btn btn-default" style="width:100%">Go</button>
}
这种方法产生了一些问题。首先,我真的想利用razor中的@model
功能,并将其指向我的站点
类,但由于它是自动生成的,所以我不想到处乱翻,添加一大堆视图属性。(乞丐不能挑肥拣瘦?)
其次,Request.Form['Sites']
返回一个字符串,将其转换为和int非常难看
正如我提到的,我想将@model
功能与Html.DropDownListFor
一起使用。当使用数据库中的站点列表时,这是否可行
如何才能干净地完成此操作?解决方案1:-
控制器:-
private List<Country> GetCountries()
{
var list = new Entity.Result<List<Entity.Country>>();
list = _context.Countries.Select(tc => new Entity.Country
{
Id = tc.Id,
Name = tc.Name,
IsdCode = tc.Code,
}).ToList();
return list.Data.Select(x => new Country
{
id = x.Id,
Name = x.Name,
}).ToList();
}
查看方法:-
@Html.DropDownListFor(x => x.countryId, new SelectList(ViewBag.countryList, "id", "Name"), KahandasDhanji.Common.Localization.Application.Resources.ddlCountry,
new { @id = "ddlCountry", @rows = 1 })
在Http Post表单中,Submitimg u在HTTPPOST方法中处理该模型值
解决方案2:-
FormCollection类我们可以在控制器中捕获表单的值
[HttpPost]
public ActionResult Add(FormCollection form)
{
string strDDLValue = form["Sites"].ToString();
return View(MV);
}
希望它的工作 您可以使用ViewModel来避免从Request.Form
转换字符串值。下面是ViewModel类的外观
public class MyViewModel
{
public MyViewModel()
{
this.DropdownItems = new List<SelectListItem>();
}
public int SelectedSiteId { get; set; }
public List<SelectListItem> DropdownItems { get; set; }
}
控制器中的post-action方法如下所示model.SelectedSiteId
将是dropdownlist的选定值,类型为int
,因此您不必进行任何转换,例如Convert.ToInt32(Request.Form['Sites'))
为什么不使用ViewModel?@HamidMosalla我没有使用视图模型,因为当我查看由visual studio创建的自动生成视图时,它们能够通过使用model first类实现我试图实现的目标。换句话说,VS只能使用一个类,Site
,为CRUD生成视图。那么为什么我不能以同样的方式生成一个选择站点的视图呢?如果可以的话,我希望避免创建额外的类,并继续使用与脚手架相同的设计模式。这个简单的CRUD操作不需要使用Request.Form。跟着@model走,跟着MVC(model-View-Controller)走structure@UbiquitousDevelopers我完全同意你的意见。我的问题是,我如何做到这一点。我试图定义一个模型并创建一个drownlistfor
,但我似乎不知道如何使用模型正确地创建drownlistfor
。编辑数据时不要在视图中使用数据模型-感谢您的解决方案!我正在努力实现它。在解决方案2中,如果表单值应该是int
,该怎么办。我必须转换.ToInt32(Request.Form[“Id”])
?这对我来说很难看。有更好的方法吗?没有其他方法可以使用fromcollection或创建viewmodel来处理表单数据。。。
[HttpPost]
public ActionResult Add(FormCollection form)
{
string strDDLValue = form["Sites"].ToString();
return View(MV);
}
public class MyViewModel
{
public MyViewModel()
{
this.DropdownItems = new List<SelectListItem>();
}
public int SelectedSiteId { get; set; }
public List<SelectListItem> DropdownItems { get; set; }
}
public ActionResult Index()
{
List<Site> sites = db.Sites.ToList();
MyViewModel model = new MyViewModel();
foreach(var site in sites)
{
model.DropdownItems.Add(new SelectListItem() { Text = site.Name, Value = site.ID.ToString() });
}
return View(model);
}
@model MyViewModel
@using (Html.BeginForm("SetSite", "Home"))
{
@Html.Label("SelectedSiteId", "Site:");
@Html.DropDownListFor(m => m.SelectedSiteId, Model.DropdownItems, new { @class = "selectpicker" })
<div style="width:100%;height:25px"></div>
<button class="btn btn-default" style="width:100%">Go</button>
}
[HttpPost]
public ActionResult SetSite(MyViewModel model)
{
Session["Site"] = model.SelectedSiteId;
return RedirectToAction("Home");
}