MVC3框架,razor原理求救!!!急!!!
1、现有view层有
<div class="editor-label">发帖时间</div>
<div class="editor-field">
@Html.EditorFor(model => model.PostTime)
@Html.ValidationMessageFor(model => model.PostTime)
</div>
2、这样自己输入后的PostTime传给后台controller处理:
[HttpPost]
public ActionResult Create(Article article)
{
if (ModelState.IsValid)
{
db.Articles.Add(article);
db.SaveChanges();
return RedirectToAction("Index");
}
return View(article);
}
PS:因为之前有创建一个Article的model:
public class Article
{
public int ID { get; set; }
public string Title{ get; set; }
public string Content{ get; set; }
public string UserName{ get; set; }
public DateTime PostTime{ get; set; }
}
public class ArticleDbContext : DbContext
{
public DbSet<Article> Articles { get; set; }
}
3、按照框架流程就是前台输入内容,后台按model的形式(真个Article)存入数据库
--------------------------------------
目的:现在我想前台的UserName是登录后的用户名,PostTime也是自动生成,两个一样可以存入数据库,请问我改怎么改? 求高手指点!!!!小弟感激不尽!!!!!
------解决方案--------------------既然用户必须先登录,那在用户登录的Action中可以加入类似Session["UserName"] = username;将用户名存放到Session中。PostTime的话就不需要放到Session中了。大致代码如下:
public class Article
{
private DateTime? _postTime;
public int ID { get; set; }
public string Title{ get; set; }
public string Content{ get; set; }
public string UserName{
get
{
return Session["UserName"];
}
}
public DateTime PostTime{
get
{
if(_postTime == null)
{
_postTime = DateTime.Now;
}
return _postTime;
}
set
{
_postTime = DateTime.Now;
}
}
------解决方案--------------------在Model中使用session的确是不够好,再提供ni几个稍微复杂点的办法:
1.自己写个Binder来替代DefualtModelBinder. 在自定义的Binder中做进行预赋值。
2.写ActionFilter在Filter中进行赋值。
------解决方案--------------------
把你的 Create 方法做如下修改
C# code
[HttpPost]
public ActionResult Create([color=#FF0000][Bind(Exclude="UserName,PostTime")][/color]Article article)
{
article.UserName="你要赋值的登录名";
article.PostTime=DateTime.Now;
if (ModelState.IsValid)
{
db.Articles.Add(article);
db.SaveChanges();
return RedirectToAction("Index");
}
return View(article);
}