Добрейшего!
Возник такой вопрос как правильнее реализовать.
Имеем форму, в которую пользователи вносят некие данные, данных много и у пользователей есть некая html с частью данных.
Задача облегчить жизнь пользователям.
Появилась мысль сделать следующее, при загрузке файла отправлять его и текущую модель данных на сервер, где
1) парсить файл,
2) вычленять из него данные,
3) обновлять модель,
4 )возвращать пользователю форму с обновленной моделью.
В итоге додумался до такого, на форме две кнопки с сабмитами и разделение их по атрибутам (выискал где-то на форуме)
т.е. имеем
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
public class HttpParamActionAttribute : ActionNameSelectorAttribute
{
public override bool IsValidName(ControllerContext controllerContext, string actionName, MethodInfo methodInfo)
{
if (actionName.Equals(methodInfo.Name, StringComparison.InvariantCultureIgnoreCase))
return true;
var request = controllerContext.RequestContext.HttpContext.Request;
return request[methodInfo.Name] != null;
}
}
так же имеем два POST метода
1.
2.
3.
4.
5.
6.
7.
[Helpers.HttpParamAction]
[HttpPost]
public ActionResult UploadFromFile(MeasurementValues model, System.Web.HttpPostedFileBase file)
{
// ...
return View("CreateOrEdit", model);
}
1.
2.
3.
4.
5.
6.
7.
[Helpers.HttpParamAction]
[HttpPost]
public ActionResult Save(MeasurementValues model)
{
// ...
return RedirectToAction("Index", new { DepID = mv.DepartmentId });
}
Модель
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
public partial class MeasurementValues
{
public DateTime Date { get; set; }
public int WorkshiftId { get; set; }
public int DepartmentId { get; set; }
public string Username { get; set; }
public IEnumerable<MeasurementValue> Values { get; set; }
public string Remark { get; set; }
public int RemarkId { get; set; }
}
public partial class MeasurementValue
{
public int FlowId { get; set; }
public String FlowName { get; set; }
public String FlowEd { get; set; }
public double ValueMin { get; set; }
public double ValueMax { get; set; }
public double Value { get; set; }
public int? FlowGOrderNum { get; set; }
public int FlowOrderNum { get; set; }
public long MeasuringId { get; set; }
}
форма в view объявлена как
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
<form action="" method="post" enctype="multipart/form-data">
@Html.ValidationSummary(true)
<div class="form-actions">
<label for="file">Filename:</label>
<input type="file" name="file" id="file" />
<button type="submit" name="UploadFromFile" value="UploadFromFile" class="btn btn-primary">Сохранить</button>
</div>
<fieldset class="form-horizontal">
<legend>@ViewBag.ActionName <small>@Model.Date.ToShortDateString(), @ViewBag.Workshift, @ViewBag.Department, @ViewBag.RoleID</small></legend>
<input type="hidden" value='@Model.Date.ToShortDateString()' />
@Html.HiddenFor(model => model.DepartmentId)
@Html.HiddenFor(model => model.WorkshiftId)
@Html.HiddenFor(model => model.Username)
<table class="table table-striped table-hover" style="width:100%;">
<thead class="header">
<tr>
<th>п/п</th>
<th>Наименование</th>
<th>Значение</th>
<th></th>
</tr>
</thead>
@Html.EditorFor(model => model.Values)
</table>
<p>Пояснение</p>
@Html.HiddenFor(model => model.RemarkId)
@Html.TextAreaFor(model => model.Remark)
<div class="form-actions">
<button type="submit" name="Save" value="Save" class="btn btn-primary">Сохранить</button>
@Html.ActionLink("Отмена", "Index", new { DepID = Model.DepartmentId }, new { @class = "btn " })
</div>
</fieldset>
</form>
собственно, работает все кроме передачи файла в System.Web.HttpPostedFileBase file, туда упорно приходит null.
Вопрос кто виноват и что делать как заставить это работать, или тыкните носом в правильный путь :)