【问题标题】:How to display a form in cshtml?如何在cshtml中显示表单?
【发布时间】:2013-10-11 20:49:09
【问题描述】:

一段时间以来,我一直在尝试使用 cshtml 显示表单,但它给我带来了很多问题。我正在使用 ASP.NET MVC。

这是我的控制器代码:

    [HttpGet]
    public ActionResult Search()
    {
        return View();
    }

    [HttpPost]
    public ActionResult Search(Models.SearchModel user)
    {

        List<Models.SearchModel> UserList = new List<Models.SearchModel>();

        MySqlConnection connection = DBConnect.getconnection(); // setting connection to database
        MySqlCommand cmd = new MySqlCommand("GetUsers", connection); // search for procedure called "GetData"
        cmd.CommandType = CommandType.StoredProcedure;

        cmd.Parameters.Add(new MySqlParameter("?search", MySqlDbType.VarChar)); // search parameters, if not looking for anythinf gets all the data
        cmd.Parameters["?search"].Value = "%" + "" + "%";
        cmd.Parameters["?search"].Direction = ParameterDirection.Input;

        MySqlDataReader dr = cmd.ExecuteReader(); // telling program to read Data
        while (dr.Read())
        {
            int id = Convert.ToInt16(dr["ID"]);
            string user_name = Convert.ToString(dr["user_name"]); // converting data to a string

            Models.SearchModel UserMod = new Models.SearchModel(id, user_name);

            UserList.Add(UserMod);

        }

        dr.Close(); // close

        DBConnect.CloseConnection(connection); // closes connection


        return View("Search");
    }

我的模特:

 namespace AOSExpress.Models
 {
   public class SearchModel
 {
    private int id;
    public int Id
    {
        get { return id; }
        set { id = value; }
    }

    private string user_name;

    public string User_Name
    {
        get { return user_name; }
        set { user_name = value; }
    }

    public SearchModel(int i, string usnm)
    {
        id = i;
        user_name = usnm;

    }
}
}

还有我的 Search.cshtml:

 @model IEnumerable<AOSExpress.Models.SearchModel>

 @{
 ViewBag.Title = "Search";
 Layout = "~/Views/Shared/_Layout.cshtml";
 }


 @foreach (var item in Model)
 {
   @Html.Partial("_SearchModel", item)
 }

和_Search.cshtml

  @model AOSExpress.Models.SearchModel

   <table style="font-family: Arial; border:1px solid black; width: 300px">
    <tr>
        <td><b>ID:</b></td>
        <td>@Model.Id</td>
    </tr>
    <tr>
        <td><b>Username:</b></td>
        <td>@Model.User_Name</td>
    </tr>

</table>

错误是:

App_Web_5m4f2la2.dll 中出现“System.NullReferenceException”类型的异常,但未在用户代码中处理

附加信息:对象引用未设置为对象的实例。

【问题讨论】:

  • 尽量不要使用Partial
  • 您正在将字符串“search”传递给您的视图,而它正在等待搜索模型的集合
  • 与问题没有真正的关系,但您确定要为每个结果创建一个单独的表吗?还是应该是更大表格的行?
  • NullReferenceException 的几乎所有情况都是相同的。请参阅“What is a NullReferenceException in .NET?”获取一些提示。

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


【解决方案1】:

可能是您将视图设置为错误的ActionResult。换句话说,如果您将视图设置为 Search 且没有代码而仅设置 return View(); 代码,您将获得 System.NullReferenceException,因为模型不在该方法中。此外,如果您只想显示一个表格而不需要用户输入,那么真的不需要[HttpGet][HttpPost]

因此,要解决此问题,您可能需要采取以下步骤:

剪切 [HttpPost] Search内的所有代码并粘贴到 [HttpGet] Search内。

然后彻底清除[HttpPost] Search方法。

然后删除 [HttpGet] 上面的 public ActionResult Search() 连同额外的 return View(); 复制后你可能有代码结束。

希望这会有所帮助。

哦,请确保将模型传递给视图 return View(UserList);

【讨论】:

    【解决方案2】:

    您没有将 SearchModel 列表传递给视图。所以视图中的Model为null。

    return View("Search", UserList);
    

    这应该可以解决您的问题。

    此外,ASP-MVC 高度基于约定。由于您的操作和视图具有相同的名称(搜索),您可以在调用视图时省略第一个参数:

    return View(UserList);
    

    【讨论】:

    • 你能用完整的堆栈跟踪更新你的问题吗?如果在 Visual Studio 中调试,在 Search() 开头附近放置一个断点,异常是在断点之前还是之后发生?
    猜你喜欢
    • 1970-01-01
    • 2015-11-20
    • 2022-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-01
    • 2021-11-03
    相关资源
    最近更新 更多