Javascript 一个数据库条目的多个表单

Javascript 一个数据库条目的多个表单,javascript,c#,asp.net-mvc,Javascript,C#,Asp.net Mvc,我有一本字典,其中包含多个问题,我想反复阅读并询问用户。现在,每个问题都必须在视图中单独呈现。但是,所有答案必须编译到一个数据库(模型)条目中 目前,我已将视图/控制器设置为这样: 控制器: //GET public ActionResult questions(){ Dictionary<string, string> questionsDic = ... return(questionsDic) } //POST public ActionResult question

我有一本字典,其中包含多个问题
,我想反复阅读并询问用户。现在,每个问题都必须在视图中单独呈现。但是,所有答案必须编译到一个数据库(模型)条目中

目前,我已将视图/控制器设置为这样:
控制器:

//GET
public ActionResult questions(){
  Dictionary<string, string> questionsDic = ...
  return(questionsDic)
}

//POST
public ActionResult questions(FormCollection answers){
  myModel foo = new myModel();
  foreach(string key in answers.AllKeys){
    foo.GetType().GetProperty(key).SetValue(foo, answers[key], null);
  }
  using(var db = new entity()){
    db.foos.add(foo);
     db.savechanges();
  }
return RedirectToAction("index");
}
//获取
公共行动结果问题(){
字典问题dic=。。。
返回(问题DIC)
}
//职位
公共行动结果问题(表格收集答案){
myModel foo=新的myModel();
foreach(答案中的字符串键。所有键){
foo.GetType().GetProperty(key).SetValue(foo,answers[key],null);
}
使用(var db=new entity()){
db.foos.add(foo);
db.savechanges();
}
返回操作(“索引”);
}
现在控制器工作正常,但视图变得非常复杂(伪):

@model字典
@使用(Html.BeginForm()){
@{
字符串lastQuestion=Model.Keys.Last();
foreach(模型中的问题){
@model[问题]

如果(问题==最后一个问题) { } 其他的 { } } } }
然后基本上我使用javascript来隐藏和显示问题,以便它们都显示在各自的视图中。在最后一个问题上,会出现一个提交按钮(用于提交表单)

所以我的问题是,有没有更好的方法来构建这个期望的功能?javascript部分真的感觉像是一个黑客。我研究过Ajax,但我不确定这是否是我想要走的路线。。。我希望有一种方法可以迭代我的问题字典,并发送每个问题的视图。然后,我可以编译提交的表单并在db中输入一个条目


谢谢。

我真的认为您当前的方式是最好的方式,考虑到您卸载了客户端的所有内容,因此减少了往返服务器的次数。如果你觉得每个问题都需要一个视图,请查看以下内容

您可以使用滑动过期缓存来保存数据,并在回答最后一个问题时执行CRUD操作

创建一个控制器操作,该操作将获取视图模型,并对它们所处的问题进行计数,在使用最近的答案更新缓存对象后,您只需返回一个视图模型,其中包含下一个问题的问题、答案和问题编号。差不多

public ActionResult AnswerQuestion(QAndAViewModel vm)
{
    //update answer cache here
    //get next question by adding 1 to the question count in the view model
    return View(new QAndAViewModel { Question = "How are you?", QuestionCount = vm.QuestionCount + 1 });
}
您的缓存对象应该是一个Dict,其中int是问题计数,string是答案,这样,如果他们点击后退按钮并重新提交以前的答案,您可以对此进行解释

无论如何,这里是我使用的缓存单例

public class CacheSingleton
{
    private static readonly Lazy<CacheSingleton> Lazy =
        new Lazy<CacheSingleton>(() => new CacheSingleton());

    public static CacheSingleton Instance
    {
        get { return Lazy.Value; }
    }

    private CacheSingleton()
    {
        _cache = MemoryCache.Default;
    }

    private readonly ObjectCache _cache;

    public object Get(string key)
    {
        var contents = _cache[key];
        return contents;
    }

    public void Add(string key, object value, bool useSlidingExpiration = true, int minutesUntilExpiration = 15)
    {
        if (value == null || String.IsNullOrWhiteSpace(key))
        {
            return;
        }

        var policy = new CacheItemPolicy();
        if (useSlidingExpiration)
        {
            policy.SlidingExpiration = new TimeSpan(0, minutesUntilExpiration, 0);
        }
        else
        {
            policy.AbsoluteExpiration = DateTimeOffset.UtcNow.AddMinutes(minutesUntilExpiration);
        }

        _cache.Set(key, value, policy);
    }

    public void Remove(string key)
    {
        if (_cache.Contains(key))
        {
            _cache.Remove(key);
        }
    }
}
公共类CacheSingleton
{
私有静态只读惰性=
新的Lazy(()=>newcachesingleton());
公共静态缓存单实例
{
获取{return Lazy.Value;}
}
私有缓存单例()
{
_cache=MemoryCache.Default;
}
私有只读对象缓存\u缓存;
公共对象获取(字符串键)
{
var contents=_缓存[key];
返回内容;
}
public void Add(字符串键、对象值、bool useSlidingExpiration=true、int minutesUntilExpiration=15)
{
if(value==null | | String.IsNullOrWhiteSpace(key))
{
返回;
}
var policy=new CacheItemPolicy();
如果(使用滑动到期)
{
policy.SlidingExpiration=新的时间跨度(0,分钟数,0);
}
其他的
{
policy.AbsoluteExpiration=DateTimeOffset.UtcNow.AddMinutes(分钟数UntilexPiration);
}
_cache.Set(键、值、策略);
}
公共无效删除(字符串键)
{
if(_cache.Contains(key))
{
_缓存。删除(键);
}
}
}

看着你的代码,我的眼睛热泪盈眶。请开始使用和。因为这就是你应该如何使用MVC

关于您的问题:您不想尝试一些向导插件,甚至自己编写吗?比如说。这就是你的情况

在你看来,如果你想更容易地提出你的问题,你可以试试。您只需为您的问题创建
ViewModel
,然后为该模型创建
EditorTemplate
,您根本不需要在
视图上进行循环

但作为一个维度,您首先应该了解使用强类型视图的所有好处和方法

public class CacheSingleton
{
    private static readonly Lazy<CacheSingleton> Lazy =
        new Lazy<CacheSingleton>(() => new CacheSingleton());

    public static CacheSingleton Instance
    {
        get { return Lazy.Value; }
    }

    private CacheSingleton()
    {
        _cache = MemoryCache.Default;
    }

    private readonly ObjectCache _cache;

    public object Get(string key)
    {
        var contents = _cache[key];
        return contents;
    }

    public void Add(string key, object value, bool useSlidingExpiration = true, int minutesUntilExpiration = 15)
    {
        if (value == null || String.IsNullOrWhiteSpace(key))
        {
            return;
        }

        var policy = new CacheItemPolicy();
        if (useSlidingExpiration)
        {
            policy.SlidingExpiration = new TimeSpan(0, minutesUntilExpiration, 0);
        }
        else
        {
            policy.AbsoluteExpiration = DateTimeOffset.UtcNow.AddMinutes(minutesUntilExpiration);
        }

        _cache.Set(key, value, policy);
    }

    public void Remove(string key)
    {
        if (_cache.Contains(key))
        {
            _cache.Remove(key);
        }
    }
}