表单 -
@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参数发送。
其他值cardTitle
在EditCard
方法中为空。
如何使用转发器获取此值?
但是,如果数据不是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>
}
但是如果转发器的值不是方法。 只要我更改了标题或其他内容的值,值就会变旧。
从图片 -
和服务器代码 -
从第1张照片中可以看出,Form可以从列表中编辑一个记录。只要我将某些内容更改为标题为 - &gt; 2nd Upload
至2nd Uploadsssss
然后在服务器端这个值为null。我的意思是这个表格不会发送它的值。
注意 -
但是我可以通过参数在URL中发送值。但是如果我确实改变了Title或aboutCard
模型值。表单只保留发送表单时默认发送的值。
答案 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();
}
以下是快速观察中的结果
希望这有帮助。