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

时间:2015-04-21 21:48:42

标签: javascript c# asp.net-mvc

我有一个包含多个问题<string (question name), string (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");
}

现在控制器工作正常,但视图变得非常复杂(伪):

@model Dictionary<string, string> 
@using (Html.BeginForm()){
  @{
    string lastQuestion =  Model.Keys.Last();
    foreach(question in model){
    <div class="individualQuestion">
       <p> @model[question] </p>
       <input... @question>
       if (question == lastQuestion)
       {
         <input type="submit" value="Submit" class="questionActionButton" />
       }
       else
       {
        <input type="button" value="Next Question" class="questionActionButton"/>
       }  
   </div>
  }

 }
}

然后基本上我使用javascript来隐藏和显示问题,所以它们似乎都在他们各自的视图中。在最后一个问题上,出现一个提交按钮(提交表单)。

所以我的问题是,有没有更好的方法来构建这个所需的功能? javascript部分真的感觉像是黑客。我查看了Ajax,但我不确定这是否是我想要去的路线...我希望有一种方法可以迭代我的问题字典并为每个字典发送一个视图。然后我可以编译表单提交并在数据库中输入一个。

感谢。

2 个答案:

答案 0 :(得分:1)

老实说,我认为你当前的方式是最好的方式,考虑到卸载客户端的所有内容,以便减少来回服务器的次数。如果您觉得需要查看每个问题,请查看以下内容......

您可以执行滑动到期缓存来保存数据,并在回答最终问题时执行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是问题计数而字符串是答案,这样如果他们点击后退按钮并重新提交先前的答案,你就可以解释。

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

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

答案 1 :(得分:1)

看着你的代码让我的眼睛流着血。请开始使用Strongly Typed ViewsHtml Helpers。那就是你应该如何使用MVC。

关于您的问题:您不想尝试某些向导插件甚至自己编写吗?比如jWizard。这绝对是你的理由。

在您的视图中,如果您想更轻松地呈现问题,可以尝试EditorTemplates。您应该为您的问题创建ViewModel,然后为此模型创建EditorTemplate,而您根本不需要在View上进行循环播放!

但是作为开头的一个方面,你应该首先了解所有好处以及使用强类型视图的方式。