GVKun编程网logo

如何将IEnumerable列表传递到MVC中的控制器(包括复选框状态)?

13

本文将带您了解关于如何将IEnumerable列表传递到MVC中的控制器的新内容,同时我们还将为您解释包括复选框状态?的相关知识,另外,我们还将为您提供关于asp.net-mvc–ASP.NETMVC

本文将带您了解关于如何将IEnumerable列表传递到MVC中的控制器的新内容,同时我们还将为您解释包括复选框状态?的相关知识,另外,我们还将为您提供关于asp.net-mvc – ASP.NET MVC 3列表到IEnumerable、asp.net-mvc – Knockout.js&复选框列表:发布到mvc控制器、asp.net-mvc – MVC – 如何将模型从视图传递到控制器、asp.net-mvc – 传递IEnumerable变量以在ASP.NET MVC中查看的实用信息。

本文目录一览:

如何将IEnumerable列表传递到MVC中的控制器(包括复选框状态)?

如何将IEnumerable列表传递到MVC中的控制器(包括复选框状态)?

我有一个mvc应用程序,其中使用了这样的模型:

 public class BlockedIPViewModel{    public string  IP { get; set; }    public int ID { get; set; }    public bool Checked { get; set; }}

现在我有一个视图来绑定这样的列表:

@model IEnumerable<OnlineLotto.Web.Models.BlockedIPViewModel>@using (Html.BeginForm()){  @Html.AntiForgeryToken()}@foreach (var item in Model) {<tr>    <td>        @Html.HiddenFor(x => item.IP)                   @Html.CheckBoxFor(x => item.Checked)    </td>    <td>        @Html.DisplayFor(modelItem => item.IP)    </td></tr>}<div>    <input type="submit" value="Unblock IPs" /></div>

现在,我有一个控制器可以从“提交”按钮接收操作:

 public ActionResult BlockedIPList(IEnumerable<BlockedIPViewModel> lstBlockedIPs) {  }

但是当我进入控制器动作时,我得到的lstBlockedIPs为空值。我需要在这里获取复选框状态。请帮忙。

答案1

小编典典

请改用列表,然后将foreach循环替换为for循环:

@model IList<BlockedIPViewModel>@using (Html.BeginForm()) {     @Html.AntiForgeryToken()    @for (var i = 0; i < Model.Count; i++)     {        <tr>            <td>                @Html.HiddenFor(x => x[i].IP)                           @Html.CheckBoxFor(x => x[i].Checked)            </td>            <td>                @Html.DisplayFor(x => x[i].IP)            </td>        </tr>    }    <div>        <input type="submit" value="Unblock IPs" />    </div>}

或者,您可以使用编辑器模板:

@model IEnumerable<BlockedIPViewModel>@using (Html.BeginForm()) {     @Html.AntiForgeryToken()    @Html.EditorForModel()       <div>        <input type="submit" value="Unblock IPs" />    </div>}

然后定义~/Views/Shared/EditorTemplates/BlockedIPViewModel.cshtml将为集合的每个元素自动呈现的模板:

@model BlockedIPViewModel<tr>    <td>        @Html.HiddenFor(x => x.IP)        @Html.CheckBoxFor(x => x.Checked)    </td>    <td>        @Html.DisplayFor(x => x.IP)    </td></tr>

您在控制器中获得null的原因是因为您不遵守默认模型绑定程序希望成功绑定到列表的输入字段的命名约定。我邀请你阅读followingarticle

阅读完后,请结合我的示例和您的示例查看生成的HTML(更具体地说是输入字段的名称)。然后进行比较,您将了解为什么您的列表不起作用。

asp.net-mvc – ASP.NET MVC 3列表到IEnumerable

asp.net-mvc – ASP.NET MVC 3列表到IEnumerable

我目前不满意填充DropDownListFor()对象的方式.我试图找到尽可能填充IEnumerable的通用方法.这就是我到目前为止所拥有的.

帮手:

public static List<SelectListItem> ToSelectList(IDictionary<string,string> dictionaryItems,string selectedValue,string noSelection,bool search = false)
    {
        List<SelectListItem> items = new List<SelectListItem>();

        if (search)
        {
            items.Add(new SelectListItem { Selected = true,Value = "-1",Text = string.Format("-- {0} --",noSelection) });
        }

        foreach (var item in dictionaryItems)
        {
            items.Add(new SelectListItem
            {
                Text = item.Key,Value = item.Value,Selected = selectedValue == item.Value ? true : false
            });
        }

        return items
            .OrderBy(l => l.Text)
            .ToList();
    }

控制器:

[HttpGet]
    public ActionResult Index()
    {
        var model = new CreateModel();

        var parentOrganisations = _orgs.FindBy(o => o.OwningOrganisationID == Globals.OrganisationID || o.ID == Globals.OrganisationID)
            .OrderBy(o => o.OrganisationName);

        Dictionary<string,string> items = new Dictionary<string,string>();

        foreach (var item in parentOrganisations)
        {
            items.Add(item.OrganisationName,item.ID.ToString());
        }

        model.Organisations = SelectLists.ToSelectList(items,"-1","-- None -- ",true);

        return View(model);
    }

视图:

<div>
        <label>Parent Organisation</label>
        <div>
            @Html.DropDownListFor(m => m.ParentOrganisationID,Model.Organisations,new { @})
            <p>Select a parent organisation to create a branch</p>
        </div>
    </div>

控制器中似乎有很多重复的代码.它需要一个通用列表,将值和文本添加到字典中,然后将其用作帮助程序的输入,该帮助程序构建选择列表以作为模型的一部分发送.

有没有人有更好的方法来实现这一目标?我讨厌在我的控制器中臃肿,当我在表单上得到几个下拉时,这正是在这个实例中会发生的事情.

谢谢,

编辑 – 感谢Kenneth的帮助方法,我现在将整个事情整合到控制器中的一个调用中:

model.Organisations = _orgs.FindBy(o => o.OwningOrganisationID == Globals.OrganisationID || o.ID == Globals.OrganisationID)
            .OrderBy(o => o.OrganisationName)
            .ToList()
            .ToSelectList(org => org.OrganisationName,org => org.ID.ToString(),"None",true);

解决方法

您可以提供获取密钥和值的回调,然后使用它们.除此之外,您可以将其创建为扩展方法:

扩展方法:

public static List<SelectListItem> ToSelectList<T>(this List<T> Items,Func<T,string> getKey,string> getValue,noSelection) });
        }

        foreach (var item in Items)
        {
            items.Add(new SelectListItem
            {
                Text = getKey(item),Value = getValue(item),Selected = selectedValue == getValue(item) ? true : false
            });
        }

        return items
            .OrderBy(l => l.Text)
            .ToList();
    }

用法:

List<Org>() parentOrganisations = // fetch here
model.Organisations = parentOrganisations.ToSelectList(org => org.ID.ToString(),org => org.OrganisationName,true);

注意:我在SO编辑器中键入了这个,因此您可能会遇到一些语法错误(尽管它们应该很容易解决).

asp.net-mvc – Knockout.js&复选框列表:发布到mvc控制器

asp.net-mvc – Knockout.js&复选框列表:发布到mvc控制器

我有一个MVC视图模型,如下所示:

public class DirectorySearchModel
{
    [display(Name = "First name contains")]
    public string FirstName { get; set; }

    [display(Name = "Last name contains")]
    public string LastName { get; set; }

    public CountriesCollection Countries { get; set; }
    public IEnumerable<Country> SelectedCountries { get; set; }
    public IEnumerable<Country> AllCountries { get; set; }
}

CountriesCollection对象(第9行)如下所示:

public class CountriesCollection
{
    [display(Name = "Countries")]
    public int[] arrCountries { get; set; }
}

现在,我正在创建一个新的,空白的CountriesCollection实例,然后将其添加到DirectorySearchModel视图模型的空白实例中,然后将其全部序列化为Knockout.js的javascript视图模型:

{
"FirstName":null,"LastName":null,"Countries":{"arrCountries":[]},"SelectedCountries":[{"RelationshipManager":{},"CountryId":1,"CountryName":"UK"},{"RelationshipManager":{},"CountryId":2,"CountryName":"France"},"CountryId":3,"CountryName":"Spain"}],"AllCountries":[{"RelationshipManager":{},"CountryName":"Spain"}]
}

我的复选框呈现为:< input checked =“checked”data-bind =“checked:Countries.arrCountries”id =“Countries_arrCountries30”name =“Countries.arrCountries”type =“checkBox”value =“1”>.检查一对夫妇意味着你最终得到这个Knockout.js视图模型:

{
"FirstName":null,"Countries":{"arrCountries":["1","3"]},"CountryName":"Spain"}]
}

正常提交我的视图(即通过提交按钮而不是Knockout.js)到一个需要DirectorySearchModel的MVC操作,我可以请求model.Countries.arrCountries获取已检查项目的列表,但是当我使用…

$.post("/MyController/MyAction",ko.toJS(viewmodel),function(returnData) {
    $("#resultCount").html(returnData);
});

要么…

$.post("/MyController/MyAction",viewmodel,function(returnData) {
    $("#resultCount").html(returnData);
});

对于需要相同DirectorySearchModel的另一个动作,model.Countries.arrCountries始终为null!我想知道是否由于Knockout.js在MVC期待int [] s时将arrCountries条目发布为string [] s,但更改我的MVC代码以期望string [] s似乎没有太大变化……! DirectorySearchModel中的CountriesCollection对象似乎存在,但是其中的arrCountries始终为null.

有任何想法吗?任何帮助非常感谢!

编辑

接收Knockout.js viewmodel的操作:

public MvcHtmlString ResultCount(DirectorySearchModel model)
{
    return new MvcHtmlString(getResultCount(model).ToString());
}

getResultCount方法:

public int getResultCount(DirectorySearchModel model)
{
    IUserRepository userRepository = new UserRepository();
    int count = userRepository.Search(model,null).Count();
    return count;
}

固定!

感谢Konstantin指出从$.post到$.ajax的简单切换将我的Knockout.js视图模型发送回我的mvc动作就是所有需要的!这是我正在使用的$.ajax代码:

$.ajax({  
    type: "POST",url: "/MyController/MyAction",data: ko.toJSON(viewmodel),contentType: "application/json; charset=utf-8",dataType: "json",success: function (data) {
        $("#resultCount").html(data);
    }
});

解决方法

你不能使用$.post你需要去底层$.ajax并添加正确的contenttype以使mvc接受发布的json并进行模型绑定(contenttype应为“application / json; charset = utf-8”)google对于它,你会有很多例子

asp.net-mvc – MVC – 如何将模型从视图传递到控制器

asp.net-mvc – MVC – 如何将模型从视图传递到控制器

我正在使用一个模型,需要流经一系列控制器和视图(沿着第一个控制器加载它).有没有办法将模型从视图中持久保存到控制器等等?

这是我的代码.

模型:

public class ROWModel
{
    #region Properties
    //Request
    public List<TBLRETURNABLEITEMS> TBLRETURNABLEITEMS { get; set; }
    //public List<ReturnReasons> ReturnReasons { get; set; }

    public int Order_No { get; set; }
    public string First_Name {get; set; }
    public string Last_Name {get; set; }
    public string Company { get; set; }
    public string Address_1 { get; set; }
    public string Address_2 { get; set; }
    public string City { get; set; }
    public string State { get; set; }
    public string Postal_Code { get; set; }
    public string Email { get; set; }
    public string Phone { get; set; }
    public string CustomerCode {get; set; }
    public string TerritoryCode {get; set; }


    //Post

    #endregion

    #region Constructor
    public ROWModel()
    { }
    #endregion
}

public class ReturnableItems : IComparable<ReturnableItems>
{
    private int _id;
    private decimal _ordered;
    private decimal _shipped;

    public int Id
    {
        get { return _id; }
        set { _id = value; }
    }

    public decimal Ordered
    {
        get { return _ordered; }
        set { _ordered = value; }
    }

    public decimal Shipped
    {
        get { return _shipped; }
        set { _shipped = value; }
    }

}

填充模型并将其发送到视图后,将使用模型显示所有内容.我认为在表单标签上坚持这样的模型:

<% using (Html.BeginForm("Items","ROW",Model))

这是ROW控制器的post Items Action:

[ActionName("Items"),AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Items(ROWModel model,FormCollection collection)

问题是Model没有返回我最初填充它的TBLRETURNABLEITEMS列表.它保留了我填充的其他属性,但不保留列表.如何维护此模型的数据,而不必在每个控制器上重新加载它.

解决方法

我认为你可以使用TempData.

所以像这样:

[AcceptVerbs(HttpVerbs.Get)]
    public ActionResult TestA()
    {
        MyModel model = new MyModel();
        model.something = "Test";
        return View(model);
    }

    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult TestA(MyModel model)
    {
        TempData["MyModel"] = model;
        return RedirectToAction("TestB");
    }

    [AcceptVerbs(HttpVerbs.Get)]
    public ActionResult TestB()
    {
        MyModel myModel = (MyModel)TempData["MyModel"];
        return View(myModel);
    }

asp.net-mvc – 传递IEnumerable变量以在ASP.NET MVC中查看

asp.net-mvc – 传递IEnumerable变量以在ASP.NET MVC中查看

我会说一点点英语.我试着问我的问题.

我有一个模特.它的名字是Product.cs

Product
  {
    public int TypeId { get; set; }/*these are at the same time field of Type Table*/
    public string TypeName { get; set; }

    public int TradeMarkId { get; set; }/*at the same time field of TradeMark Table*/
    public string TradeMarkName { get; set; }

    public int ProductId { get; set; }/*at the same time field of TProduct Table*/
    public string ProductName { get; set; }
    public int TId { get; set; }
    public int TMId { get; set; }

    public List<TypeProduct> typeList { get; set; }
  }

我的控制器页面

My controller 
  [HttpGet]
  public ActionResult TradeMarkProduckAdd()
  {
    Product product = new Product();
    TypeList typeList = new TypeList();
    product = typeList.Typelistof(product);
    return View(product);//"This doesn't work"            
  }

它说一个类型错误
传递到字典中的模型项的类型为“TypeMark.Models.Product”,但此字典需要类型为“System.Collections.Generic.IEnumerable”1 [TypeMark.Models.Product]’的模型项.

当我收到此错误时,我更改了返回View(产品);至
return View((IEnumerable)product);但它再也没有用了.

查看页面

@using TypeTradeMark.Models
    @model IEnumerable<Product>
    @using (Html.BeginForm("AddProduct","Home",FormMethod.Post))
    {
      @foreach(var item in Model as List<Product>)
      {                              
        @item.ProductName
        @item.??//checkBox for every record      
        @item.??//dropdownlist for Trademarks      
      }    
    }

TypeList类

TypeList class

    public class TypeList
    {
      VtDataContext Vt = new VtDataContext();
      public Product Typelistof(Product typelistof)
      {          
        var query = (from c in Vt.Types select c);
        typelistof.typeList=new List<Type>(query.ToList());
        return typelistof;
      }
    }

我的桌子

Type : TypeId,TypeName
    TradeMark : TradeMarkId,TradeMarkName
    TProduct : ProductId,ProductName,TId,TMId//TId relation with TypeId,TMId relation with TradeMarkId

我无法解决问题你能帮助我吗?谢谢

解决方法

您可以查看产品类型对象的期望列表,请参阅(@model IEnumerable< Product>).

尝试使用这样的东西:

return View(new List<Product> { product,product2 })

关于如何将IEnumerable列表传递到MVC中的控制器包括复选框状态?的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于asp.net-mvc – ASP.NET MVC 3列表到IEnumerable、asp.net-mvc – Knockout.js&复选框列表:发布到mvc控制器、asp.net-mvc – MVC – 如何将模型从视图传递到控制器、asp.net-mvc – 传递IEnumerable变量以在ASP.NET MVC中查看等相关知识的信息别忘了在本站进行查找喔。

本文标签: