我使用带有aspx视图引擎的asp.net mvc从excel文件中读取,从中提取联系人信息,将其显示给用户,当他确认将其保存在数据库中时。
现在,在我的页面中,我将DataTable作为模型,并使用foreach循环向用户显示。然后我有一个提交按钮,当用户点击它时,我希望我的数据表回到Controller中的Action。但是我的数据表是空的。
如何让我的数据表回到我的控制器?
aspx第一行:
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Authenticated.master"
Inherits="System.Web.Mvc.ViewPage<System.Data.DataTable>" %>
控制器动作定义:
public virtual ActionResult SaveExcelContacts(DataTable dt)
答案 0 :(得分:1)
我认为你无法在提交时绑定DataTable
,或者至少它不是很好的概念。请查看DataTable
http://msdn.microsoft.com/en-us/library/system.data.datatable.aspx的文档。将所有数据发送到客户端并在服务器上检索它以重建DataTable
对象太复杂了
您最好将DataTable
中的数据提取到您自己的模型类中,然后尝试在提交时绑定到它。不要忘记以视图的形式包含隐藏的输入,因此数据将被发布到服务器并且可以绑定。
更新 - 只添加了一些可以帮助您解决问题的代码段
// some service for data retrieval
public interface IUserService{
/// <summary>
/// Extracts MyUserInfo object from DataTable (or excel)
/// </summary>
MyUserInfo GetUserInfo(int id);
void SaveUserInfo(MyUserInfo userInfo);
}
// model class
public class MyUserInfo
{
public int UserId { get; set; }
public string Name { get; set; }
}
//controller
public class MyController : Controller
{
IUserService userService;
[HttpGet]
public ActionResult UserInfo(int userId)
{
var user = userService.GetUserInfo(userId);
return View(user);
}
[HttpPost]
public ActionResult UserInfo(MyUserInfo myUserInfo)
{
userService.SaveUserInfo(myUserInfo);
return RedirectToAction("SomeOtherAction","OnControllerOfYourChoice");
}
}
视图的
<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<MyUserInfo>" %>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
<% using (Html.BeginForm("UserInfo","MyController"))
{ %>
<label>UserName:</label>
<%= Model.Name %>
<%= Html.HiddenFor(m => m.UserId) %>
<%= Html.HiddenFor(m => m.Name) %>
<input type="submit" name="ConfirmUser" value="Confirm" />
<%} %>
</asp:Content>