【问题标题】:Passing Model Object Data from View, to Controller, to Model?将模型对象数据从视图传递到控制器,再到模型?
【发布时间】:2013-05-08 05:01:43
【问题描述】:

我是 ASP.net MVC 的新手(大约一个星期),所以仍然有很多困惑......

如何将当前视图模型传递给控制器​​,以便获取模型数据?

查看

@model KineticBomardment.Models.Blog.BlogPost

@{
    ViewBag.Title = "Index";
}


@using (Html.BeginForm())
{
@Html.ValidationSummary(false)

    <fieldset class="block">
       <div class="input">
            @Html.LabelFor(x => x.Title)
            @Html.EditorFor(x => x.Title)
        </div>
         <div class="input">
            @Html.LabelFor(x => x.ShortDescription)
            @Html.EditorFor(x => x.ShortDescription)
        </div>

        <div class="button">
            @Html.ActionLink("Submit", "CreateNewBlogEntry", "Admin" );
        </div>

    </fieldset>

}

然后我有一个控制器

 public ActionResult CreateNewBlogEntry(Models.Blog.BlogPost currentBlogModel)
    {
        if (ModelState.IsValid)
        {
            currentBlogModel.CreatePost();
            return Content("Created!");
        }

        return View();
    }

还有一个模型

public class BlogPost
{
    public int Id { get; set; }

    [Required]
    [Display(Name="Title of Blog Post")]
    public string Title { get; set; }

    public DateTime DateCreated { get; set; }

    [Required]
    [Display(Name = "Short Description")]
    public string ShortDescription { get; set; }

    public string LongDescription { get; set; }

    public int HeaderImage { get; set; }

    public ICollection<BlogPost> GetAllPosts()
    {
        ICollection<BlogPost> posts = new List<BlogPost>();

        using (SqlConnection connection = new   SqlConnection(ConfigurationManager.ConnectionStrings["KineticBombardment"].ToString()))
        {
            using (SqlCommand cmd = new SqlCommand("select title, datecreated, shortdescription from blogentries where id > 0", connection))
            {
                cmd.Parameters.Clear();
                connection.Open();
                cmd.ExecuteNonQuery();

                using (SqlDataReader reader = cmd.ExecuteReader())
                {
                    while(reader.Read())
                    {
                        this.ShortDescription = reader["shortdescription"].ToString();
                        this.Title = reader["title"].ToString();
                        this.DateCreated = Convert.ToDateTime(reader["datecreated"].ToString());
                        posts.Add(this);
                    }
                }

                return posts;
            }
        }
    }

    public void CreatePost()
    {
        using (SqlConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings["KineticBombardment"].ToString()))
        {
            using (SqlCommand cmd = new SqlCommand("insert into blogentries (shortdescription, datecreated, blogtype, title) values (@shortdescription, @datecreated, @blogtype, @title)", connection))
            {
                cmd.Parameters.Clear();
                connection.Open();

                cmd.Parameters.Add("@shortdescription", SqlDbType.VarChar, 500).Value = this.ShortDescription;
                cmd.Parameters.Add("@datecreated", SqlDbType.DateTime).Value = DateTime.Now;
                cmd.Parameters.Add("@blogtype", SqlDbType.Int).Value = 1;
                cmd.Parameters.Add("@title", SqlDbType.VarChar, 255).Value = this.Title;

                cmd.ExecuteNonQuery();

            }
        }
    }

}

【问题讨论】:

    标签: asp.net-mvc razor


    【解决方案1】:

    变化:

        <div class="button">
            @Html.ActionLink("Submit", "CreateNewBlogEntry", "Admin" );
        </div>
    

    收件人:

        <input type="submit" class="button" />
    

    public ActionResult CreateNewBlogEntry(Models.Blog.BlogPost currentBlogModel)
    {
        if (ModelState.IsValid)
        {
            currentBlogModel.CreatePost();
            return Content("Created!");
        }
    
        return View();
    }
    

    public ActionResult CreateNewBlogEntry()
    {
        return View();
    }
    
    [HttpPost]
    public ActionResult CreateNewBlogEntry(Models.Blog.BlogPost model)
    {
        if (ModelState.IsValid)
        {
            currentBlogModel.CreatePost();
            return Content("Created!");
        }
        return View();
    }
    

    我做了一些假设,但这应该可行

    【讨论】:

    • 我不完全确定为什么,但是将控制器动作和控制器添加到 Html.BeginForm() 并添加一个简单的提交输入就可以了。 @using (Html.BeginForm("CreateNewBlogEntry", "Admin")),不完全确定为什么 ActionLink 不起作用。
    • 酷,如果有意义的话,操作链接并没有真正提交表单。如果您查看生成页面,您会发现表单看起来像 &lt;form action="Admin/CreateNewBlogEntry"&gt;
    • 谢谢乔,我不知道如果指定了操作链接,我仍然需要表单操作。
    猜你喜欢
    • 2012-08-01
    • 2010-11-25
    • 1970-01-01
    • 2013-11-20
    • 1970-01-01
    • 1970-01-01
    • 2013-06-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多