 <p>As KD suggested, I would add name attributes to all the form elements. </p> <pre><code>&lt;input type="text" name="length" value="8" id="length_field"&gt; &lt;input type="checkbox" id="includeLetters" checked&gt; </code></pre> <p>etc...</p> <p>but I would let the model binder give us strongly typed values by specifying the argument type.</p> <pre><code>[HttpPost] public ActionResult PasswordGenerator(int length, bool includeLetters, etc...) { } </code></pre> <p>If the number of arguments exceeds what you feel comfortable with, simply create an object with [properties that match your form field. IE:</p> <pre><code>public class PasswordGeneratorArguments { public int Length {get;set} public bool IncludeLetters {get;set} etc... } </code></pre> <p>and use that as the argument</p> <pre><code>[HttpPost] public ActionResult PasswordGenerator(PasswordGeneratorArguments model) { } </code></pre>