读书人

MVC3框架razor原理!

发布时间: 2012-08-11 20:50:31 作者: rapoo

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);  } 

读书人网 >.NET Framework

热点推荐