日期:2014-05-20  浏览次数:20733 次

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