I'd often just create the form in those multiple places, use a separate ViewModel and wire that up to fire off the relevant command.
But I'm not overly scared of duplication at that high a level in a project - and that's a personal preference thing.
I'd suggest in your case,using a partial view which assumes there is an object on your view model called Address, using a prefix in front of the names its binding to.
That object on your view model can be a shared object used on all the view models which require an address, let's say for convenience called "Address", of type "AddressViewModelComponent".
public class SomeViewModel
{
public string SomeFormValue
{
get;
set;
}
public string SomeOtherFormValue
{
get;
set;
}
public AddressViewModelComponent Address
{
get;
set;
}
}
public class AddressViewModelComponent
{
public string AddressLineOne
{
get;
set;
}
public string AddressLineTwo
{
get;
set;
}
// Etc
}
This way you can put an address on any view model that needs it, and your partial view could contain something like the following:
<li><%= Html.TextBox("Address.AddressLineOne") %></li>
<li><%= Html.TextBox("Address.AddressLineTwo") %></li>
Your actual view form would then look something like this:
<% using(Html.BeginForm()) %>
<ul>
<li><%= Html.TextBox("SomeFormValue") %></li>
<li><%= Html.TextBox("SomeOtherFormValue") %></li>
<% Html.RenderPartial("AddressForm"); %>
</ul>
<%} %>
The default model binder knows to look for an object called "Address" on the view model, and populate the property on that view model with the relevant property.
This might be overkill, and I've never found an instance where I've needed to "share" a form on my projects, but the above is probably where I'd start looking if I was to do it.