Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在ASP.NET MVC中将对象的ID从窗体传递到操作_C#_Asp.net_Asp.net Mvc_Razor - Fatal编程技术网

C# 如何在ASP.NET MVC中将对象的ID从窗体传递到操作

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

我有一个ASP.NETMVC项目,其中包含基于EF6的实体(模型优先)。所以我的实体都是为我自动生成的。我有一个实体,
站点
,我只希望用户在继续之前选择一个
站点
。我试过几种方法,所有的方法都有效,但它们看起来非常混乱和不必要

我对创建
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");
}