通过mvc转发器发布值

时间:2014-03-13 07:43:52

标签: c# .net asp.net-mvc

表单 -

@using IEnumerable<Myapplication.Models.CardModel>
    @foreach(var item in Model)
    {

          <form method="post" action="/Upload/EditCard/?cardID=@item.cardID" enctype="multipart/form-data">
                                    <h3>
                                        Change Title-
                                    </h3>
                                    <div class="display-field">
                                        @Html.HiddenFor(m => item.cardTitle)
                                        @Html.TextBoxFor(cardTitle => item.cardTitle)
                                    </div>
                                     <img src="@item.cardFilePath" />
                                    <input type="submit">
                          </form>
    }

方式 -  [HttpPost]

public void EditCard(CardModel card, HttpPostedFileBase file) {}

我在表单中通过此表单发送值,cardID以表单的url参数发送。

其他值cardTitleEditCard方法中为空。

如何使用转发器获取此值?

但是,如果数据不是IEnumerable类型,那么我可以直接通过表单发送值 -

@using Myapplication.Models.CardModel

      <form method="post" action="/Upload/EditCard/?cardID=@Model.cardID" enctype="multipart/form-data">
                                <h3>
                                    Change Title-
                                </h3>
                                <div class="display-field">
                                    @Html.HiddenFor(m => m.cardTitle)
                                    @Html.TextBoxFor(m=> m.cardTitle)
                                </div>
                                 <img src="@Model.cardFilePath" />
                                    <input type="submit">
                      </form>
}

但是如果转发器的值不是方法。 只要我更改了标题或其他内容的值,值就会变旧。

从图片 -

enter image description here

和服务器代码 -

enter image description here

从第1张照片中可以看出,Form可以从列表中编辑一个记录。只要我将某些内容更改为标题为 - &gt; 2nd Upload2nd Uploadsssss

然后在服务器端这个值为null。我的意思是这个表格不会发送它的值。

注意 -

但是我可以通过参数在URL中发送值。但是如果我确实改变了Title或aboutCard模型值。表单只保留发送表单时默认发送的值。

3 个答案:

答案 0 :(得分:1)

而不是使用foreach使用for循环。要应用索引,您需要将Model转换为List

  @{ var list=Model.ToList();)

@for(var i = 1;i <= list.Count();i++)
{   

  <form method="post" action="/Upload/EditCard/?cardID=@list[i].cardID" enctype="multipart/form-data">
                            <h3>
                                Change Title-
                            </h3>
                            <div class="display-field">
                                @Html.HiddenFor(m => list[i].cardTitle)
                                @Html.TextBoxFor(m=> list[i].cardTitle)
                            </div>
                             <img src="@list[i].cardFilePath" />
                                <input type="submit">
  </form>

}

更新..

我测试过相同但不起作用。我创建了变通方法检查是否有帮助。

在控制器中使用cardId获取标题

 var title=Request["[" + (model.cardTitle)+ "].cardTitle"];

对于模型的其他属性也可以做同样的事情。

请注意,我已更改for循环,索引现在以1

开头

答案 1 :(得分:1)

您需要将IEnumerable更改为IList,然后您才能通过索引正确绑定Model。

见这个有效的工作。

查看页面

@model IList<MvcApplication3.Models.CardModel>

@using (Html.BeginForm("EditCard", "Home", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
    for (int i = 0; i < Model.Count; i++) 
    {
        @Html.HiddenFor(m => Model[i].CardID)
        @Html.TextBoxFor(cardTitle => Model[i].CardTitle)
        <img src="@Model[i].CardFilePath" />
        <input type="file" name="files"> 
    }
    <br>
    <input type="submit" value="Upload File to Server">
}

<强>控制器

        [HttpPost]
        public void EditCard(IList<CardModel> cm, IEnumerable<HttpPostedFileBase> files)
        {
            string strfile = string.Empty;
            string cardTitle = string.Empty;
            if (files != null)
            {
                foreach (var file in files) //loop through to get posted file
                {
                    strfile = file.FileName;
                }
            }
            if (cm != null)
            {
                foreach (var item in cm) //loop through to get CardModel fields
                {
                    cardTitle = item.CardTitle;
                }
            }
        }

答案 2 :(得分:1)

我不知道这是否有助于解决您的问题。我试过这个并且效果很好。

模特

public class CardFileModel
{
    public int CardId { get; set; }
    public string Name { get; set; }
    public HttpPostedFileBase File { get; set; }
}

指数行动

public ActionResult Index()
{
   List<CardFileModel> cards = new List<CardFileModel>
   {
       new CardFileModel{ CardId =1 , Name="Card1"  },
       new CardFileModel{ CardId =2 , Name="Card2"  }
   };

   return View(cards);
}

主页视图

@model List<MVC3Stack.Models.CardFileModel>
@{
    ViewBag.Title = "Home Page";
}
<h2>@ViewBag.Message</h2>
@for (int i = 0; i < Model.Count; i++)
{
    using (Html.BeginForm("Index", "Home", FormMethod.Post, new { enctype = "multipart/form-data" }))
    {
    <div>
        <div>
            @Html.TextBoxFor(x => x[i].CardId)
        </div>
        <div>
            @Html.TextBoxFor(x => x[i].Name)
        </div>
        @Html.TextBoxFor(x => x[i].File, new { type = "file" })
        <input type="submit" value="submit" id="submit" />
    </div>
    }
}

指数发布行动

[HttpPost]
public ActionResult Index(List<CardFileModel> card)
{
    //Access your card file from the list. 
    var name = card.FirstOrDefault().Name;
    return View();
}

以下是快速观察中的结果

Quick Watch snapshot

希望这有帮助。